Что происходит (за занавесом), когда это выполняется?
int x = 7;
x = x++;
То есть, когда переменная увеличивается на единицу и присваивается себе в одном выражении? Я скомпилировал и выполнил это. x
еще 7 даже после всего заявления . В моей книге говорится, что x
увеличивается!
java
operators
post-increment
Майкл
источник
источник
int x = 7; x = ++x;
конечно, все еще ужасный код, вам не нужно переназначать.int x = 7; x++;
достаточно.x += 1
, кроме, может быть, в петлях.for(int x=0; x<7; x++)
Ответы:
x
действительно увеличивается. Но вы назначаете старую ценностьx
обратно в себя.x++
увеличиваетx
и возвращает его старое значение.x =
присваивает старое значение себеТаким образом, в конце концов,
x
возвращается обратно к своему начальному значению.источник
x
получает приращение первых , прежде чем он прочитал в этом случае, так что вы в конечном итоге сx + 1
.эквивалентно
источник
x=x+1
вместоx++
x = x++
, а не только приращение постаx++
.x = ++x;
также эквивалентноint tmp = x; ++x; x = tmp;
, поэтому по какой логике мы можем сделать вывод, что ваш ответ правильный (какой он есть)?x=x++
=MOV x,tmp; INC x; MOV tmp,x
Заявление:
эквивалентно:
Короче говоря, заявление не имеет никакого эффекта.
Ключевые моменты:
Значение выражения увеличения / уменьшения Postfix - это значение операнда до того, как произойдет увеличение / уменьшение. (В случае формы префикса значением является значение операнда после операции)
RHS выражения присваивания полностью оценивается (включая любые приращения, уменьшения и / или другие побочные эффекты) до того, как значение присваивается LHS.
Обратите внимание, что в отличие от C и C ++, порядок вычисления выражения в Java полностью указан, и нет места для изменения, зависящего от платформы. Компиляторам разрешено переупорядочивать операции только в том случае, если это не изменит результат выполнения кода с точки зрения текущего потока. В этом случае компилятору будет разрешено оптимизировать весь оператор, поскольку можно доказать, что он не используется.
Если это еще не очевидно:
Надеемся, что программы проверки кода, такие как FindBugs и PMD, будут отмечать код как подозрительный.
источник
x++
вместоx = x++
.Он имеет неопределенное поведение в C и для Java см. Этот ответ . Это зависит от компилятора, что произойдет.
источник
Конструкция like
x = x++;
показывает, что вы, вероятно, неправильно понимаете, что++
делает оператор:Давайте перепишем это, чтобы сделать то же самое, основываясь на удалении
++
оператора:Теперь давайте перепишем это, чтобы сделать (что я думаю), что вы хотели:
Тонкость здесь заключается в том, что
++
оператор изменяет переменнуюx
, в отличие от такого выражения, какx + x
, которое будет вычислять значение int, но сама переменная останетсяx
неизменной. Рассмотрим такую конструкцию, как почтенныйfor
цикл:Заметили
i++
там? Это тот же оператор. Мы можем переписать этотfor
цикл следующим образом, и он будет вести себя так же:Я также рекомендую не использовать
++
оператор в больших выражениях в большинстве случаев. Из-за тонкости того, когда она изменяет исходную переменную до пост-приращения (++x
иx++
, соответственно), очень легко вводить тонкие ошибки, которые трудно отследить.источник
Согласно байт-коду полученному из файлов классов,
Оба назначения увеличивают х, но разница заключается во времени
when the value is pushed onto the stack
В
Case1
, Push происходит (а затем назначается позже) до приращения (по сути, это означает, что ваш прирост ничего не делает)В
Case2
, сначала происходит инкремент (делая его 8), а затем помещается в стек (а затем назначается х)Случай 1:
Байт-код:
Случай 2:
Байт код
источник
Увеличивается после "
x = x++;
". Было бы 8, если бы вы сделали "x = ++x;
".источник
x = x++
, то должно быть 8.Постинкрементный оператор работает следующим образом:
Итак, утверждение
будет оцениваться следующим образом:
Таким образом, x действительно увеличивается, но поскольку x ++ присваивает результат обратно x, значение x переопределяется на предыдущее значение.
источник
Инкремент происходит после вызова x, поэтому x по-прежнему равен 7. ++ x будет равен 8 при вызове x
источник
Когда вы переназначаете значение,
x
оно все еще равно 7. Попробуйте,x = ++x
и вы получите 8, иначе сделайтеисточник
потому что x ++ увеличивает значение ПОСЛЕ присвоения его переменной. так далее и во время выполнения этой строки:
переменная x будет по-прежнему иметь исходное значение (7), но снова использовать x в другой строке, например
даст вам 8.
если вы хотите использовать увеличенное значение x в вашем операторе присваивания, используйте
Это увеличит x на 1, ТО затем присвоит это значение переменной x.
[Edit] вместо x = x ++, это просто x ++; первый присваивает исходное значение x самому себе, поэтому он фактически ничего не делает в этой строке.
источник
Что происходит, когда
int x = 7; x = x++;
?ans ->
x++
означает сначала использовать значение x для выражения, а затем увеличить его на 1.Это то, что происходит в вашем случае. Значение x в RHS копируется в переменную x в LHS, а затем значение
x
увеличивается на 1.Аналогично
++x
означает->
увеличение значения х сначала на единицу, а затем использовать в выражении.Так что в вашем случае, если вы это сделаете,
x = ++x ; // where x = 7
вы получите значение 8.
Для большей ясности попытайтесь выяснить, сколько операторов printf выполнит следующий код
источник
x
8, но это 7 - приращение происходит между чтением и присваиванием++x
это постинкремент->
x увеличивается перед использованиемx++
это постинкремент->
x увеличивается после использованияисточник
Так что это означает:
x++
не равноx = x+1
так как:
и теперь это кажется немного странным:
очень зависит от компилятора!
источник
(x = x + 1, x-1)
в C, где допускаются выражения, разделенные запятыми.х = х ++;
Это оператор после увеличения. Это следует понимать как «Использовать значение операнда и затем увеличивать операнд».
Если вы хотите, чтобы произошло обратное, то есть «Увеличьте операнд, а затем используйте значение операнда», вы должны использовать оператор предварительного увеличения, как показано ниже.
х = ++ х;
Этот оператор сначала увеличивает значение x на 1, а затем присваивает значение обратно x.
источник
Я думаю, что этот спор можно решить, не вдаваясь в код и просто подумав.
Рассмотрим i ++ & ++ i как функции, скажем Func1 & Func2.
Теперь я = 7;
Func1 (i ++) возвращает 7, Func2 (++ i) возвращает 8 (это знают все). Внутри обе функции увеличивают i до 8, но они возвращают разные значения.
Поэтому я = i ++ вызывает функцию Func1. Внутри функции i увеличивается до 8, но по завершении функция возвращает 7.
Таким образом, в конечном итоге 7 получает я. (Итак, в итоге я = 7)
источник
Это потому, что вы использовали оператор постинкрементного. В этой следующей строке кода
Что происходит, вы присваиваете значение x для x. x ++ увеличивает x после того, как значение x присвоено x. Вот как работают операторы постинкрементной обработки. Они работают после того, как заявление было выполнено. Таким образом, в вашем коде x возвращается первым, а затем постепенно увеличивается.
Если вы сделали
Ответ будет 8, потому что вы использовали оператор предварительного увеличения. Это увеличивает значение перед возвратом значения x.
источник