C++ cout 中的单引号

4

来自《使用C++进行编程:原理与实践》第72-73页:

我们发现不能直接添加字符或将double与int进行比较。 然而,C++提供了间接的方法来完成这两个操作。在需要时,char会被转换为int,int会被转换为double。例如:

char c = 'x'; 
int i1 = c; 
int i2 = 'x'; 

这里i1和i2都得到了值120,这是最流行的8位字符集ASCII中字符'x'的整数值。这是获取字符的数字表示的一种简单且安全的方法。我们将此称为char-to-int转换安全,因为没有信息丢失;也就是说,我们可以将结果int复制回char并获得原始值:

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

这将打印x 120 x

我不明白这里单引号的用法。当我尝试它时,它会打印x540818464x


8
这可能是你重写或书中的错误。如果你复制得正确,你是否尝试查找勘误表以了解作者是否已经修正了这个错误? - Some programmer dude
3
您可能希望输出:cout << c << ' ' << i1 << ' ' << c2 << '\n'; - Jarod42
Bjarne的书有相当多的错别字,并且并不是全部都能够进入勘误表。如果您正在阅读数字版,这些版本通常在转换过程中会产生新的错误。 - molbdnilo
5个回答

5
"' << i1 << ' 是多字符字面值,其类型为 int,具有实现定义的值。

您可能想要使用常规字符空格:

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

4
那段代码的唯一解释是这本书印刷错误,或者是明显的打字错误。正确的代码应该是:
cout << c << ' ' << i1 << ' ' << c2 << '\n';

3
这看起来确实像是一个打字错误,我们可以安全地推测作者的意思是:
cout << c << ' ' << i1 << ' ' << c2 << '\n';

错误的代码虽然可以编译,但是毫无意义:

does 指的是代码中的一个单词,这个单词在上下文中没有任何作用。

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

在这里,' << i1 << '(注意单引号)被称为多字符字面量,它的类型为 int ,具体实现取决于编译器。

[lex.ccon]/2

包含多个c-char的普通字符字面量是多字符字面量。多字符字面量是有条件支持的,类型为 int,并具有特定于实现的值。

它的使用相对较少,我个人见过它作为定义任意常量的一种方式,例如:

enum state { wait = 'wait', start = 'start', /*...*/ };

我能理解为什么对于任意常量值来说这是有吸引力的。这使得避免包含定义它们的头文件更加困难。 - StoryTeller - Unslander Monica
1
顺便提一下,由于它们具有实现定义的值,某些实现中可能会发生 'wait' == 'start' 的情况... - Jarod42

1
你应该尝试下面的代码。书中或你自己可能有一个拼写错误。
#include <iostream>
using namespace std;

int main() {
    char c = 'x';
    int i1 = c;
    int i2 = 'x';
    char c2 = i1;
    std::cout << c << ' ' << i1 << ' ' << c2 << '\n';
    return 0;
}

结果:

enter image description here


0

通过使用单引号,我们可以打印ASCII值。因此整个表达式的ASCII值被打印出来。

谢谢,希望这对你有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接