Умышленно или случайно у вас есть <<в конце первой выходной строки, где вы, вероятно, имели в виду ;. Так что по сути у вас есть
cout << "2+3 = "; // this, of course, prints "2+3 = "
cout << cout; // this prints "1"
cout << 2 + 3; // this prints "5"
cout << endl; // this finishes the line
Итак, вопрос сводится к следующему: зачем cout << cout;печатать "1"?
Это, как ни удивительно, оказывается тонким. std::coutчерез свой базовый класс std::basic_iosпредоставляет определенный оператор преобразования типа, который предназначен для использования в логическом контексте, как в
while (cout) { PrintSomething(cout); }
Это довольно плохой пример, так как трудно получить выход из строя, но std::basic_iosна самом деле он является базовым классом как для входных, так и для выходных потоков, а для входных данных он имеет гораздо больше смысла:
int value;
while (cin >> value) { DoSomethingWith(value); }
(выходит из цикла в конце потока или когда символы потока не образуют действительное целое число).
Теперь точное определение этого оператора преобразования изменилось между версиями стандарта C ++ 03 и C ++ 11. В более старых версиях он был operator void*() const;(обычно реализован как return fail() ? NULL : this;), а в более новых explicit operator bool() const;(как правило, реализован как return !fail();). Оба объявления отлично работают в логическом контексте, но ведут себя по-разному при (неправильном) использовании вне такого контекста.
В частности, согласно правилам C ++ 03, cout << coutбудет интерпретироваться cout << cout.operator void*()и печатать какой-то адрес. Согласно правилам C ++ 11, cout << coutне должен компилироваться вообще, поскольку оператор объявлен explicitи, следовательно, не может участвовать в неявных преобразованиях. Фактически, это было основной причиной изменения - предотвращение компиляции бессмысленного кода. Компилятор, соответствующий любому стандарту, не создаст программу, которая печатает "1".
По-видимому, некоторые реализации C ++ позволяют смешивать и сопоставлять компилятор и библиотеку таким образом, чтобы получить несоответствующий результат (цитируя @StephanLechner: «Я нашел параметр в xcode, который дает 1, и другой параметр, который дает адрес: Диалект языка c ++ 98 в сочетании с «Стандартная библиотека libc ++ (стандартная библиотека LLVM с поддержкой c ++ 11)» дает 1, тогда как c ++ 98 в сочетании с libstdc (стандартная библиотека GNU C ++) дает адрес; »). У вас может быть компилятор в стиле C ++ 03, который не понимает explicitоператоров преобразования (которые появились в C ++ 11), в сочетании с библиотекой в стиле C ++ 11, которая определяет преобразование как operator bool(). С таким миксом становится возможным cout << coutинтерпретировать как cout << cout.operator bool(), что, в свою очередь, просто cout << trueи печатает "1".
;в конце первой выходной строки, а не<<. Вы не печатаете то, что вы думаете, что печатаете. Вы делаете тоcout << cout, что печатаете1(какcout.operator bool()мне кажется). Затем сразу следует5(от2+3), делая его похожим на число пятнадцать.