Вы на самом деле есть это неправильный путь вокруг:
i=i+1
ближе к ++i
чем i++
Причина этого заключается в том, что она делает в любом случае только разницу с окружающими выражениями, как:
j=++i
дает ямайских такое же значение, как и j=(i+=1)
j=(i=i+1)
Там в целом гораздо больше к истории, хотя:
1) Для того, чтобы быть на той же земле, давайте посмотрим на разницу в преинкремента и постинкремента:
j=i++
против j=++i
Первый пост-инкремент (значение возвращается и «пост» = после этого увеличивается на единицу), чем позже один предварительно приращение (значение «до» = перед тем увеличивается, а затем возвращается)
Таким образом, (мульти заявление) эквиваленты будут: j=i; i=i+1;
и i=i+1; j=i;
соответственно
Это делает все это очень интересно с (теоретически) выражениями типа j=++i++
(которые являются незаконными в стандартном C, хотя, поскольку вы не можете менять одну переменную в одном выражении несколько раз)
Это также интересно в отношении заграждений памяти, поскольку современные процессоры могут выполнять так называемое выключение из строя, что означает, что вы можете записать код в конкретный порядок, и он может быть выполнен в совершенно ином порядке (tho Конечно, для этого есть определенные правила). Компиляторы могут также изменить порядок вашего кода, поэтому 2 заявления фактически заканчиваются тем же самым в конце.
-
2) В зависимости от компилятора, выражения, скорее всего, на самом деле же после компиляции/оптимизации и т.д.
Если у вас есть автономное выражение i++;
и ++i;
компилятор, скорее всего, преобразуйте его в промежуточную команду «ADD» asm. Вы можете попробовать это самостоятельно с большинством компиляторов, например. с gcc это -s
, чтобы получить промежуточный выход asm.
Кроме того, в течение многих лет, составители, как правило, для оптимизации очень часто конструкта
for (int i = 0; i < whatever; i++)
, как непосредственно перевод i++
в этом случае может испортить дополнительный регистр (и возможные привести к регистрации разлива) и привести к невостребованной инструкции (мы говорим о вещах здесь, столь незначителен, что это на самом деле не имеет значения, если цикл не проходит триллион раза с одной инструкцией ассемблерной или тому подобным)
-
3) Вернуться к первоначальному вопросу, все это является старшинство вопрос, как 2 заявления могут быть выражены в виде (на этот раз немного более точным, чем верхнее объяснение):
something = i++
=>temp = i; i = i + 1; something = temp
и
something = ++i
=>i = i + 1; something = i
(здесь вы также можете увидеть, почему первый вариант теоретически привести к более регистру пролит и больше инструкций)
Как вы можете видеть здесь, первое выражение не может быть легко изменено так, как я думаю, удовлетворит ваш вопрос, поскольку его невозможно выразить с использованием символов приоритета, например. скобки или, проще понять, блок). Для второго, хотя, это легко:
++i
=>(++i)
=>{ i = i + 1; return i }
(псевдокод)
для первого, который будет
i++
=>{ return i; i = i + 1 }
(псевдо-код еще раз)
Как вы можете видеть, это не сработает.
Надеюсь, что я помог вам прояснить ваш вопрос, если что-нибудь, возможно, потребуется уточнение или я сделал ошибку, не стесняйтесь указать на это.
Значение «i ++» и «++ i» может изменяться в зависимости от контекста, например. 'foo (i ++)' не совсем то же самое, что 'foo (++ i)'. – devnull
О, мои дорогие теги .. –
Это зависит от языков, так что укажите, на каком языке вы задаете свой вопрос. –