为什么这个简单的程序打印“1Hello World”?

时间:2017-12-19 18:10:55

标签: c++ iostream

我仍然试图进入C ++并编写了这段代码:

#include <iostream>
using namespace std;

int main()
{

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

}

输出结果为:

1Hello world!

为什么Hello World之前有1?

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

3 个答案:

答案 0 :(得分:7)

对您的问题的简短回答是,您用于输出数据的语法略有偏差。如果将一堆输出语句链接在一起,那么惯例就是将流放在最左边而不重复它。所以而不是写

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

写一下

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

您在此处看到1的原因有点技术性。流类型都提供了一个重载的运算符,您可以使用它来测试流是否有效。例如,你可以这样写:

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插入到输出流中,C ++将首先尝试将cout转换为布尔值并改为打印该值。默认情况下,布尔值打印为1(真)或0(假),因此您看到的1是C ++说&#34;是的,此流已启动并正在运行。&#34;

(从技术上讲,重载运算符会生成void*而不是bool,但我现在会对该细节进行掩饰。)

请注意,现代版本的C ++(C ++ 11和转发版)不支持此行为,如果您尝试使用现代编译器执行此操作,则实际上会出现编译器错误。如果可能的话,我建议升级你的编译器版本,这会给你一个错误,而不是生成没有你认为它做的代码。

答案 1 :(得分:1)

在我的lapi中,我正在使用CodeBlocks并将输出作为

  

0x489944你好世界!

这种情况正在发生,因为cout是一个对象ostream类,当你做的事情是

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

第一个cout正在控制台屏幕上打印,第二个cout被视为要打印的值以及“hello world”,这是要由第二个{{1}打印的值}。

所以基本上你从第二个cout获得输出“Hello world”,并且在hello之前得到1或其他一些数值,由第一个cout作为参考地址打印第二cout

在你的情况下,1在控制台上作为cout的引用地址打印,这可能会使编译器与编译器不同。

enter image description here

答案 2 :(得分:0)

对于大多数<<操作,cout << x(其中x属于“最”类型)返回cout本身。

(这不是一个绝对的规则,你可以定义一些operator <<,但这不是真的;但通常是的情况下)

因此cout << " "<< endl << cout被解析为((cout << " ") << endl) << cout

同样如下:

auto o1 = cout << " ";
auto o2 = o1 << endl;
auto o3 = o2 << cout;

所以第一个赋值(o1)输出一个空格并返回cout(实际上是对它的引用)。

o2)的第二个赋值输出行尾,刷新缓冲区,然后返回cout

分配o3计算cout << cout;

该运营商没有定义的重载。右cout转换为bool,净效果与cout << true相同,后者输出1并返回cout