Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

Почему вывод в консоль (двух переменных и функции подряд) одинаковый?

std::bitset<8> b(1); std::cout << b << std::endl << b.flip(1) << std::endl << b;
Почему вывод на консоль после этих инструкций
00000011 00000011 00000011
, а не
00000001 00000011 00000011
?


Ответ

В C++ порядок вычисления аргументов функции не определен (Стандарт С++ секция 5.2.2/8). Вы можете думать о конструкции (опустим << std::endl << b; для краткости)
std::cout << b << std::endl << b.flip(1);
как о:
std::operator<<(std::operator<<(std::cout, b), b.flip(1));
Очевидно, что, исходя из стандарта, ничто не мешает компилятору сначала посчитать b.flip(1). Соответственно, возникает неопределенное поведение (так как ближайшая точка следования находится при вызове функции, после вычисления ее аргументов).
P.S. Вот хорошая статья на тему точек следования.

Комментариев нет:

Отправить комментарий