C++ 为什么不能打印;2+;3=15“;在这段代码中?

C++ 为什么不能打印;2+;3=15“;在这段代码中?,c++,C++,为什么下面程序的输出是什么 #include <iostream> using namespace std; int main(){ cout << "2+3 = " << cout << 2 + 3 << endl; } 而不是预期的 2+3 = 5 此问题已经历多个关闭/重新打开周期 投票结束之前,请考虑这个问题。 < P>正如Igor所说,你得到了一个C++ 11库,其中代码> STD::Basic Su

为什么下面程序的输出是什么

#include <iostream>
using namespace std;

int main(){

    cout << "2+3 = " <<
    cout << 2 + 3 << endl;
}
而不是预期的

2+3 = 5

此问题已经历多个关闭/重新打开周期


投票结束之前,请考虑这个问题。

< P>正如Igor所说,你得到了一个C++ 11库,其中代码> STD::Basic SuxIO/COD>有<代码>操作员布尔O/COD>而不是<代码>操作符Value>代码>,但是不知何故没有声明(或被视为)<代码>显式< /代码>。有关正确的声明,请参阅

例如,一个合格的C++11编译器将给出与

#include <iostream>
using namespace std;

int main() {
    cout << "2+3 = " << 
    static_cast<bool>(cout) << 2 + 3 << endl;
}
#包括
使用名称空间std;
int main(){

cout发布的代码不应该为任何C++11(或更高版本的兼容编译器)编译,但是它应该在编译之前的C++11实现时甚至没有警告

不同之处在于C++11将流转换为bool显式:

C.2.15第27条:输入/输出库[diff.cpp03.Input.output] 27.7.2.1.3、27.7.3.4、27.5.5.4

更改:指定在现有布尔转换运算符中使用显式运算符
理由:明确意图,避免变通办法。
对原始特征的影响:依赖于隐式布尔转换的有效C++ 2003代码将失败 使用本国际标准编译。此类转换发生在以下条件下:

  • 将值传递给接受bool类型参数的函数;

ostream运算符意外输出的原因是输入错误。您可能是指

cout << "2+3 = "
     << 2 + 3 << endl;

cout无论是有意还是无意,您都可以通过这种方式轻松调试代码。当您使用
cout
时,您的输出会被缓冲,以便您可以像这样进行分析:


设想第一次出现的
cout
表示缓冲区和运算符
,您希望在第一个输出行的末尾使用分号
,而不是
@StephanLechner,它当时可能正在使用gcc4。在gcc5之前,它们没有完全兼容的流,特别是在那之前,它们仍然具有隐式转换。@IgorTandetnik这听起来像是一个答案的开始。这个问题似乎有很多微妙之处在第一次阅读时并不明显。为什么人们一直投票来结束这个问题?不是“请告诉我这个代码有什么问题”,而是“为什么这个代码会产生这个输出?”第一个问题的答案是“你打错了”,是的,但是第二个需要解释编译器是如何解释代码的,为什么它不是编译器错误,以及它是如何得到“1”的而不是指针地址。@jaggedSpire如果这不是一个印刷错误,那么这是一个非常糟糕的问题,因为它故意使用了一个看起来像印刷错误的不寻常的结构,而没有指出这是故意的。无论如何,to都值得投票。(可能是由于排版错误,也可能是坏的/恶意的。这是一个为寻求帮助的人而设的网站,而不是试图欺骗他人的人。)您的第一个建议解决方案代码中有一个排版错误。操作员太多了。现在我也这么做了,它一定会传染的。谢谢!哈!:)在我答案的初始编辑中,我建议添加分号,但没有意识到行末尾的运算符。我认为与OP一起,我们已经生成了最重要的排版。@t.C.我非常确定C++03和C++98在这一特定领域没有区别。我想我可以替换所有的排版C++03与“pre-C++11”的结合,如果这有助于澄清问题的话。我对Linux等平台上复杂的编译器和库版本控制一点也不熟悉;我是一个Windows/MSVC的家伙。我不是想在C++03和C++98之间挑三拣四;重点是libc++只是C++11和更新版本;它不试图符合C++98/03。C++03中不存在到
bool
的转换,然而,还有
std::basic_ios::operator void*()
,它作为条件或循环的控制表达式是有意义的。虽然这都是真的(并且格式优美),但我认为这是个问题。我相信问题归结为“为什么
cout+1的格式很漂亮呢?考虑到这是你的第一个答案,你能帮上忙真是太好了:)
    cout << "2+3 = "
         << 2 + 3 << endl;
    cout << "2+3 = ";
    cout << 2 + 3 << endl;
cout << "2+3 = "
     << 2 + 3 << endl;
cout << cout;
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
while (cout) { PrintSomething(cout); }
int value;
while (cin >> value) { DoSomethingWith(value); }