Страницы

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

воскресенье, 29 декабря 2019 г.

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

#cpp #консоль


std::bitset<8> b(1);
std::cout << b << std::endl << b.flip(1) << std::endl << b;


Почему вывод на консоль после этих инструкций 

00000011  
00000011  
00000011


, а не 

00000001
00000011
00000011


?
    


Ответы

Ответ 1



В 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. Вот хорошая статья на тему точек следования.

Ответ 2



В онлайн компиляторах разных версий плюсов (вроде ideone и C++ Shell) вывод такой же, как у Вас. Похоже, это не исключение, а норма. Возможно, это прописано в спецификации В целом же, использование в одной строке нескольких разных значений одной переменной грозит неопределённостью (cppreference.com).

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

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