170 похожих чатов

Всем привет! У меня появилось непонимание того, что происходит с инкрементом,

когда используешь его в присвоении значения той же переменной, с которой его и используешь:
Например,
int a = 2;
Int b = -1;

b = b-- + a++;
Я ожидаю, что b = -1 + 2 = 1, а потом от b отнимется единица. Но на деле b остается равным 1. Почему так? Оператор присвоения “перебивает” декремент?

19 ответов

20 просмотров

Ох блин... Сделай это ОТДЕЛЬНЫМ statement. Ну то есть три оператора сделай

Nick-Semin Автор вопроса
Ilya Zviagin
Ох блин... Сделай это ОТДЕЛЬНЫМ statement. Ну то ...

Да я это использовать не собираюсь, мне просто любопытна сущность этой «ошибки». Компилятор выдал предупреждение

Вообще, это всегда (в с++11) было UB, сейчас может и не UB уже, там многие порядки вычисления операций зафиксировали. Но то, что будет две конкурирующие модификации b это не отменяет.

Nick-Semin Автор вопроса
Ilya Zviagin
Думай, что это — UB

Хорошо, подумаю ещё над этим! Изначально вопрос ко мне пришёл из шарпов, поэтому я удивился, что и плюсы, и Шарпы себя так ведут

Nick-Semin Автор вопроса
Ilya Zviagin
Про шарпы - это не к нам.

Да я понимаю :) В любом случае, спасибо за ответ!

Ilya Zviagin
Вообще, это всегда (в с++11) было UB, сейчас может...

Сейчас не UB (хз, вроде и не было?). Просто оператор присвоения перетрёт изменения постфиксного декремента. Всё равно что b--; b = whatever;

Alexander "Ternvein" Isaev
Сейчас не UB (хз, вроде и не было?). Просто операт...

Всегда это было UB, теперь может быть ( в с++17+) это не UB, а гарантированное перетирание результата инкремента переменной B присваиванием B. Либо гарантированное перетирание результата присваивания в B результатом инкремента B. От этого ничуть не легче или правильнее код стал.

Ilya Zviagin
Всегда это было UB, теперь может быть ( в с++17+) ...

То, что так лучше не делать — полностью согласен. Я про то, что в целом UB было бы, если бы оба операнда сложения меняли b (их порядок был/есть не определён). А порядок сложения и присвоения здесь определён. Т.е. UB это x = b-- + b++;

Alexander "Ternvein" Isaev
То, что так лучше не делать — полностью согласен. ...

Кстати про порядок и не кстати про джаву. Когда у джависта спросил определен ли в джаве порядок вычисления аргументов функции, то он не смог ответить на этот вопрос. То ли не знает, то ли там нет этой особенности как в плюсах...

d7d1cd
Кстати про порядок и не кстати про джаву. Когда у ...

Да, в Java всё очень чётко определено. Причём очень тупо - слева направо. Ну , может там пара исключений есть.

Nick Semin
Хорошо, подумаю ещё над этим! Изначально вопрос к...

Зачем тебе думать над этим? Что полезного от того, если ты докопаешься? Никто такие выражения не пишет, потому что они сложны для понимания. Тебе что, 2 лишних строчки жалко написать?

Nick Semin
Да.

тогда тебе не в С++ надо разбираться, а в себе.

Nick-Semin Автор вопроса
Vladimir Kornev 🇷🇺
тогда тебе не в С++ надо разбираться, а в себе.

Спасибо! Всегда приятно услышать совет от опытного разработчика!

Nick Semin
Спасибо! Всегда приятно услышать совет от опытного...

извини, у меня просто немного наболело по этому поводу.

Nick-Semin Автор вопроса

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта