Пример с пост- и пре-инкрементом

365
10 мая 2018, 05:25
int i = 0;
++i == i++; //true
i++ == i++; //false

Я знаю, что в случае пре-инкремента значение сначала увеличивается, а потом используется в выражении, а в случае пост-инкремента - наоборот. Но вот данный пример не могу понять.

Спасибо @AnT и @Grundy. Я понял, что в С/С++ поведение не определено. А что в случае с Java?

Answer 1

В первом выражении допустим значение i = 1, тогда получится

++i == i++, здесь выходит что слева сначала делается инкремент а потом возвращается значение, получается в первой части выражения получается 2, как Вы сами сказали, что посткремент сначала возвращает значение, а потом увеличивает, то он сначала вернет значение 2, получается что сравниваем 2 == 2, по-этому true.

Второй вариант

i++ == i++, здесь тот же принцип, сначала оценивается левая часть выражения, мы получаем 1 и потом увеличиваем его, в итоге два в памяти, а в выражении 1, далее идет оценка правой части выражения, принцип тот же, получаем уже 2, потому что прошлый инкремент увеличил число, возвращаем 2 в выражение и увеличиваем ее, в памяти уже 3, а в выражении 2, в итоге сравниваем

1 == 2, это false

Надеюсь что ответил на Ваш вопрос

Вот ссылки на спецификацию java, во всех подобных языках оно будет работать так же

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.15.1 https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.14.2

Answer 2

Ваш вопрос бессмыслен для любого языка программирования, если не известно, что такое i.

В языках С и С++, в предположении, что i - это некий объект скалярного типа, поведение этих выражений не определено. Никаких осмысленных результатов ваши выражения не порождают. Нет никакого смысла анализировать результаты бессмысленных выражений - они не подчиняются никакой логике.

Answer 3

Для C# и Java: если сначала i == 3 в одном и в другом случаях, то соответственно имеем

++i == i++; // ++i: увеличиваем i на 1, возвращается i (4), (i == 4)
            // i++: возвращается i (4), а потом увеличивается i на 1, (i ==5)
            // получаем 4 == 4 true
i++ == i++; // i++: возвращается i (3), а потом увеличивается i на 1, (i == 4)
            // ++i: возвращается i (4), а потом увеличивается i на 1, (i == 5)
            // получаем 3 == 4 false
READ ALSO
Как обратиться к объекту в unity

Как обратиться к объекту в unity

Нужно при нажатии на кнопку "Main button", менять Active у кнопки "Home button" (то есть, отображать и прятать её)"Home button" - не вложена в "Main button"

375
Поиск в TextBox по выделенному фрагменту - C#

Поиск в TextBox по выделенному фрагменту - C#

Помогите исправить код, нужно в Textbox 2 вывести не просто выделенный фрагмент textBox1, а полностью слово в которое он входит , если их несколько...

251
Interactable в Unity UI

Interactable в Unity UI

Имеется кнопка UI в которой скрипт C# изменяет свойство InteractableПри смене свойства с кнопкой всё как надо, но элементы в ней не изменяётся таким...

272
Ломается верстка в Safari

Ломается верстка в Safari

Помогите разобраться в чем проблемаЕсть страничка

331