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); }