我正在学习C ++,刚刚开始阅读"编程原则和实践"作者:Bjarne Stroustrup,他用这段代码来说明一点:
#include "std_lib_facilities.h"
using namespace std;
int main() // C++ programs start by executing the function main
{
char c = 'x';
int i1 = c;
int i2 = 'x';
char c2 = i1;
cout << c << ' << i1 << ' << c2 << '\n';
return 0;
}
我一般都熟悉C ++世界中双引号和单引号之间的区别,但有人会详细解释该部分的结构和目的。 &LT;&LT; i1&lt;&lt; &#39;
由于
答案 0 :(得分:4)
cout << c << ' << i1 << ' << c2 << '\n';
似乎是书中的拼写错误。我在编程原理和实践使用C ++(第二版)二次打印中看到它。我没有在勘误表中看到它。
根据这本书,预期的输出是
x 120 x
但是这里发生的是' << i1 << '
尝试将<< i1 <<
压缩为多字节字符并打印出一个整数(很可能是540818464-> 0x203C3C20 - > ASCII值{{1 }})因为' ', '<', '<', ' '
不知道宽字符。您需要cout
。最终结果输出类似
wcout
以及来自编译器的一两个警告,因为虽然它是有效的C ++代码,但它几乎肯定不是你想要做的。
该行最有可能阅读
x540818464x
将输出预期的 cout << c << ' ' << i1 << ' ' << c2 << '\n';
换句话说,Linker3000,你并不疯狂,也不会误解示例代码。
任何人都知道我应该联系谁来记录勘误表或者澄清一下机会上有一些绝密的偷偷摸摸的事情发生在我头上?
答案 1 :(得分:2)
在回答你的问题之前,这里有一些关于实际行动的背景知识。另请注意,示例中存在拼写错误,字符串常量应该是双引号:
cout << c << " << i1 << " << c2 << "\n";
在C ++中,运算符可以被重载,因此它们表示具有不同功能的不同事物。在cout的情况下,&lt;&lt; 运算符被重载为“插入运算符”。将其视为右侧的操作数,并将其插入(或发送)到左侧的操作员中。
例如,
cout << "Hello World";
这将获取字符串“Hello World”,并将其发送到cout进行处理。
所以初学者没有得到的是这样的意思:
cout << "Hello" << " World";
这是做同样的事情,但运算符优先级表示从左到右执行注入。为了使其工作,cout对象将自身作为函数返回值返回。为什么这很重要?因为上述陈述实际上是两个独立的运营商评估:
(cout << "Hello") << " World";
首先向cout注入“Hello”,然后输出它,然后继续评估下一个注入操作符。因为cout返回自己,所以在执行(cout&lt;&lt;&lt;“Hello”)之后你仍然需要评估以下内容:
cout << " World";
这个表达式将“World”注入cout对象,然后输出“World”,其净效果就是你第一次看到“Hello World”。
所以在你的例子中,它在做什么?
cout << c << " << i1 << " << c2 << "\n";
从左到右评估如下:
((((cout << c) << " << i1 << ") << c2) << "\n"); => Outputs value of c
((((cout ) << " << i1 << ") << c2) << "\n"); => Outputs string " << i1 << "
((( cout ) << c2) << "\n"); => Outputs value of c2
(( cout ) << "\n"); => Outputs newline character
( cout ); => No more output
表达式完成并返回cout对象作为表达式值。
假设c ='x'且c2 ='x',此表达式的最终输出是在一行上输出以下字符串:
x << i1 << x
对于初学者,所有那些插入操作符&lt;&lt; 看起来有点奇怪。这是因为你正在处理对象。在将字符串注入cout之前,您可以将字符串构建为完整的格式化对象,虽然这使得cout表达式看起来更简单,但我们不会在C ++中这样做,因为它会使您的代码更复杂且容易出错。另请注意,cout对象没有什么特别之处。如果要输出到标准错误流,则应使用cerr。如果要输出到文件,则会实例化输出到所需文件的流对象。您示例中的其余代码将是相同的。
在C中,使用格式字符串在程序上完成同样的事情:
printf("%d << i1 << %d\n", i1, c2);
这在C ++中也是允许的,因为C ++是C的超集。许多C ++程序员仍然使用这种输出方法,但这是因为那些程序员首先学习了C,并且可能没有完全接受C ++的面向对象性质< / p>
请注意,您可能还看过&lt;&lt;运算符在数学表达式的上下文中:
A = A << 8;
在这种情况下,&lt;&lt; operator是按位旋转操作。它与输出到cout无关。它会将A中的位向左旋转8位。