C++ 单引号语法

C++ single quotes syntax

我正在学习 C++,刚开始阅读 Bjarne Stroustrup 的 "Programming Principles and Practice",他使用这段代码来说明一个观点:

#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++ 世界中双引号和单引号之间的区别,但是有人可以解释一下 ' << i1 << ' 部分的结构和目的

谢谢

在回答您的问题之前,先了解一下它实际在做什么的一些背景知识。另请注意示例中有一个错字,字符串常量应该用双引号引起来:

 cout << c << " << i1 << " << c2 << "\n";

在 C++ 中,运算符可以重载,因此它们具有不同的功能。在 cout 的情况下,<< 运算符被重载为 "Insertion Operator"。可以将其视为获取右侧的操作数,并将其插入(或发送)到左侧的运算符中。

例如,

   cout << "Hello World";

这会获取字符串 "Hello World",并将其发送到 cout 进行处理。

所以初学者不明白这样的东西是什么意思:

   cout << "Hello" << " World";

这是在做同样的事情,但是运算符优先级表示从左到右执行注入。为了使这项工作正常进行,cout 对象 return 将自身作为一个函数 return 值。为什么这很重要?因为上面的语句其实是两个独立的运算符求值:

   (cout << "Hello") << " World";

这首先将 "Hello" 注入 cout,输出它,然后继续计算下一个注入运算符。因为 cout returns 本身,在执行 (cout << "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 

表达式完成,return将 cout 对象作为表达式值。

假设c='x'和c2='x',该表达式最终输出为单行输出如下字符串:

x << i1 << x

对于初学者来说,那些插入运算符<<看起来有点奇怪。这是因为你正在处理对象。在将字符串注入 cout 之前,您可以将该字符串构建为一个完整的格式化对象,虽然这会使 cout 表达式看起来更简单,但我们不会在 C++ 中这样做,因为它会使您的代码更复杂且更容易出错。另请注意,cout 对象没有什么特别之处。如果你想输出到标准错误流,你可以使用 cerr 代替。如果你想输出到一个文件,你会实例化一个输出到所需文件的流对象。您示例中的其余代码将是相同的。

在 C 中,同样的事情可以使用格式字符串在程序上完成:

printf("%d << i1 << %d\n", i1, c2);

这在C++中也是允许的,因为C++是C的超集。许多C++程序员仍然使用这种输出方法,但那是因为那些程序员首先学习C,并且可能没有完全接受面向对象的本质C++

请注意,您可能还在数学表达式的上下文中看到过 << 运算符,例如:

A = A << 8;

本例中<<运算符就是按位循环运算。它与 cout 的输出无关。它会将 A 中的位向左旋转八位。

cout << c << ' << i1 << ' << c2 << '\n';

书中似乎有错别字。我在 Programming Principles and Practice Using C++ (Second Edition) Second printing 看到了。我没有在勘误表中看到它。

根据本书,预期输出是

x 120 x

但是这里发生的是 ' << i1 << ' 尝试将 << i1 << 压缩为一个多字节字符并打印出一个整数(很可能是 540818464-> 0x203C3C20 -> [=16 的 ASCII 值=]) 因为 cout 不认识宽字符。为此,您需要 wcout。最终结果输出类似

x540818464x

以及来自编译器的一两个警告,因为虽然它是有效的 C++ 代码,但它几乎肯定不是您想要的。

该行最有可能是

    cout << c << ' '  << i1 << ' ' << c2 << '\n';

这将输出预期的 x 120 x

换句话说,Linker3000,你没疯也没看错示例代码

任何人都知道我应该联系谁来记录勘误表或得到澄清,以防我脑子里有一些绝密的偷偷摸摸的事情?