да нач нет
Не надо так делать
Зачем это проверять )
Я знаю, сам горю, но разбираю тест для поступления товарищу
++a разве не rvalue?
Нет, только a++
Они sequenced.
Сложно, много терминов. Я правильно понял, что по стандарту получится a += 2 * a + 2? Если это int и без переполнений
auto tmp{a}; ++a; a = a + tmp;
Только 1 и 2 строки в обратном порядке же)
Ответ на единицу будет отличаться Пусть int a = 10; Или auto там ссылочный?
Нет, в верном. Порядок как раз отражает смысл очередности (правый операнд вычисляется прежде левого, а значит в данном случае его значение будет прединкрементным).
int a = 10; ++a += a; cout << a; // 22 int a = 10; auto tmp{a}; ++a; a = a + tmp; cout << a; // 21 int a = 10; ++a; auto tmp{a}; a = a + tmp; cout << a; // 22
Сейчас проверил: GCC выдает на единицу больше (и предупреждает об unsequenced), clang - на единицу меньше (ожидаемый мной вариант) и не предупреждает. Я, возможно, неверно подсказал: подробнее сейчас посмотрю.
В каком из примеров?
Рассматривал ++a += a;.
И это даёт разный ответ на разных компиляторах? Тогда всё плохо, по ходу UB)
Если я ошибся - да, но пока не знаю, где именно.
godbolt.org int f(int a) { ++a += a; return a; } x86-64 gcc 11.2 -O3 lea eax, [rdi+2+rdi] ret x86-64 clang 14.0.0 -O3 lea eax, [rdi + rdi] add eax, 1 ret И правда разное, ну видимо UB чтож
На всякий случай оповещаю. В про дискуссия здесь начинается. Судя по всему, поведение все-таки определено, а в GCC баг (и с диагностикой, и с поведением).
Обсуждают сегодня