为什么这个简单的程序要打印;“你好,世界”吗;? 我仍然试图进入C++,我编写了这个代码: #include <iostream> using namespace std; int main() { cout << " "<< endl << cout << "Hello world!" <<endl; }

为什么这个简单的程序要打印;“你好,世界”吗;? 我仍然试图进入C++,我编写了这个代码: #include <iostream> using namespace std; int main() { cout << " "<< endl << cout << "Hello world!" <<endl; },c++,iostream,C++,Iostream,为什么在Hello World之前有一个1 编辑:我的程序是编译的,似乎我有一个旧的编译器版本。对你的问题的简短回答是,你用来输出数据的语法有点不正确。如果将一组输出语句链接在一起,约定是将流放在最左边,并且不重复它。与其写,不如写 cout << " " << endl << cout << "Hello world!" << endl; ~~~~~~~ (这通常用于输入流,但输出流也支

为什么在Hello World之前有一个1


编辑:我的程序是编译的,似乎我有一个旧的编译器版本。

对你的问题的简短回答是,你用来输出数据的语法有点不正确。如果将一组输出语句链接在一起,约定是将流放在最左边,并且不重复它。与其写,不如写

cout << " " << endl << cout << "Hello world!" << endl;
                       ~~~~~~~
(这通常用于输入流,但输出流也支持这一点)。作为这种语法的结果,如果您尝试将代码>插入到输出流中,C++将首先尝试将<代码> cOUT >代码转换为布尔值,并打印该值。默认情况下,布尔值被打印为1(true)或0(false),所以你看到的1是C++,“是的,这个流是运行的”。 (从技术上讲,重载运算符生成的是
void*
而不是
bool
,但我现在将对该细节进行说明。)


作为一个注释,C++的C++(11和前文)的现代版本不支持这种行为,如果用现代编译器来做这个,实际上会得到编译器错误。如果可能的话,我建议您升级编译器版本,这会给您带来一个错误,而不是生成与您认为的不一样的代码。

在我的lapi中,我正在使用代码块并以

0x489944你好,世界

之所以发生这种情况,是因为
cout
是一个对象
ostream
类,当您执行类似操作时

cout << " "<< endl << cout << "Hello world!" <<endl;

cout对于大多数
来说,如果它正在运行,我会感到惊讶,你确定那是你的代码吗?这里没有
操作符eah,这里相当emo:这个代码片段将在
之前打印一个非空指针“Hello world!”
pre-c++11。它不会用c++11或更高版本编译。这让我想起,我认为这会更多地属于语义而不是语法,尽管除此之外,使用什么编译器来运行它,它只会对我抛出错误它会单独使用现代编译器生成编译器错误,还是只通过实际启用c++11生成编译器错误?(在很多情况下,这仍然不是默认值)@mkrieger1这是一个很好的观点-您可能需要为此启用C++11(或C++14或C++17)模式。@mkrieger1更新的GCC和trunk-Clang默认为-std=gnu++14(“C++14加上不符合标准的gnu扩展”模式)。VS2017根本没有C++98或C++11模式。我相信1来自一个布尔转换,它看起来像在C++03中,
cout
had
operator void*()const基本上没有返回失败()?空:这个。C++11移动到显式运算符bool()const。1不是“cout
的参考地址”,您只是没有使用C++11或更高版本进行编译。
cout << " "<< endl << "Hello world!" << endl;
if (cout) {
    // Everything is okay!
} else {
    // I don't know how you did it, but you broke cout and you can
    // no longer write anything to it!
}
cout << " "<< endl << cout << "Hello world!" <<endl;
auto o1 = cout << " ";
auto o2 = o1 << endl;
auto o3 = o2 << cout;