когда используешь его в присвоении значения той же переменной, с которой его и используешь:
Например,
int a = 2;
Int b = -1;
b = b-- + a++;
Я ожидаю, что b = -1 + 2 = 1, а потом от b отнимется единица. Но на деле b остается равным 1. Почему так? Оператор присвоения “перебивает” декремент?
Ох блин... Сделай это ОТДЕЛЬНЫМ statement. Ну то есть три оператора сделай
Да я это использовать не собираюсь, мне просто любопытна сущность этой «ошибки». Компилятор выдал предупреждение
Вообще, это всегда (в с++11) было UB, сейчас может и не UB уже, там многие порядки вычисления операций зафиксировали. Но то, что будет две конкурирующие модификации b это не отменяет.
Думай, что это — UB
Хорошо, подумаю ещё над этим! Изначально вопрос ко мне пришёл из шарпов, поэтому я удивился, что и плюсы, и Шарпы себя так ведут
Про шарпы - это не к нам.
Да я понимаю :) В любом случае, спасибо за ответ!
Сейчас не UB (хз, вроде и не было?). Просто оператор присвоения перетрёт изменения постфиксного декремента. Всё равно что b--; b = whatever;
Всегда это было UB, теперь может быть ( в с++17+) это не UB, а гарантированное перетирание результата инкремента переменной B присваиванием B. Либо гарантированное перетирание результата присваивания в B результатом инкремента B. От этого ничуть не легче или правильнее код стал.
То, что так лучше не делать — полностью согласен. Я про то, что в целом UB было бы, если бы оба операнда сложения меняли b (их порядок был/есть не определён). А порядок сложения и присвоения здесь определён. Т.е. UB это x = b-- + b++;
Кстати про порядок и не кстати про джаву. Когда у джависта спросил определен ли в джаве порядок вычисления аргументов функции, то он не смог ответить на этот вопрос. То ли не знает, то ли там нет этой особенности как в плюсах...
Да, в Java всё очень чётко определено. Причём очень тупо - слева направо. Ну , может там пара исключений есть.
Спасибо. Надо джависта просвятить ))
Зачем тебе думать над этим? Что полезного от того, если ты докопаешься? Никто такие выражения не пишет, потому что они сложны для понимания. Тебе что, 2 лишних строчки жалко написать?
тогда тебе не в С++ надо разбираться, а в себе.
Спасибо! Всегда приятно услышать совет от опытного разработчика!
извини, у меня просто немного наболело по этому поводу.
Да все в порядке, не волнуйтесь
Обсуждают сегодня