2015-06-06 4 views
-1

В чем разница? Я думал, что эти 2 версии должны быть равными, но, видимо, это не так. Не могли бы вы объяснить, как работает первый? Почему он печатает 222 вместо 122?Как работает cout? (C++)

#include <iostream> 
using namespace std; 

int main() { 
    int a = 1; 
    /* #1: prints 222 
    cout << a << (a = 2) << a << endl; 
    */ 

    /* #2: prints 122 
    cout << a; 
    cout << (a = 2); 
    cout << a << endl; 
    */ 
    return 0; 
} 
+1

Читайте о точках последовательности. –

+0

Вы назначаете 'a' to 2, который изменяет значение. Ostream оценивает значения до их вывода. – Poriferous

+0

@ Покровный правый. Позвольте мне объяснить немного больше. Компилятор прочитает каждую строку и изменит значение, после чего он будет работать с результатом. В вашей строке кода компилятора кода << << (a = 2) << a; здесь строка чтения компилятора и вы меняете значение a = 2, тогда ничего не меняется в полной строке. и после этого компилятор напечатает результат. Итак, a был изменен до 2? то результат будет 222. – UnKnown

ответ

0

Насколько я знаю, у вас нет никакой гарантии, в каком порядке вложенные выражения выражения << оцениваются. В первой версии ваш компилятор решает выполнить назначение перед первым выходом.

Вторая версия, однако, делает порядок операций явным. Точка с запятой дает понять, что операция печати должна выполняться до операции присваивания.

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