允许使用多个字符进行 C++ 字符初始化 [重复]
Posted
技术标签:
【中文标题】允许使用多个字符进行 C++ 字符初始化 [重复]【英文标题】:C++ Char Initialization Allowed With Multiple Characters [duplicate] 【发布时间】:2017-05-10 21:59:49 【问题描述】:在通过阅读一本书了解 C++ 的过程中,我看到了这行(对我而言)奇怪的代码。
char ch('AB'); // Or char ch = 'AB';
这对我来说很奇怪,因为我不明白您可以分配给char
多个“字母”而不会出现任何异常。
cout << "Characters in ch: " << ch << endl; // Output B
为什么会这样?它在内部是如何运作的?是否只保存最后一个字符而忽略其他字符?
【问题讨论】:
编译器会警告你。 coliru.stacked-crooked.com/a/26a2279249229f4c 确切的行为是根据规范定义的实现。如果同一本书没有提到将其与特定编译器一起使用,那么这是一个严重的错误。 顺便说一句,分配给许多不能保存为一个整数的字符是(至少在 Visual Studio 中)显示警告。 【参考方案1】:它被称为multicharacter literal,它是完全有效的 C++:
多字符文字,例如
'AB'
,具有int
类型和实现定义的值。[...]
许多多字符文字的实现使用文字中每个字符的值来初始化结果整数的连续字节,以大端顺序,例如
'\1\2\3\4'
的值为0x01020304
。
【讨论】:
该页面上的注释说“许多多字符文字的实现” - 不是“全部”,因此它可能不是“完全有效”。 好吧,起初你以为每个字符都用一个字节表示,但我错了 @RadLexus 您所指的注释解释了有多少实现实现了该行为。该标准仍然保证 all 实现必须实现 some 行为,这使得构造有效 C++。对于文字的值,仅不保证任何特定行为。 规格(可能是故意的)含糊不清。该构造是有效的(它会做something),但接下来发生的事情留给实现。因此,使用 OP 的示例,c1 = 'AB'; c2 = 'A';
可能会为 c1 == c2
生成 true。【参考方案2】:
这对我来说很奇怪,因为我不明白您可以将多个“字母”分配给一个字符而不会出现任何异常。
您应该将其视为类型转换 (demo):
#include <iostream>
using namespace std;
int main()
int i = 'abcd';
char c = i; // cast form int to char -> c == 'd'
cout << c; // prints 'd'
char c = 'abcd'; // cast form int to char -> c == 'd'
cout << c; // prints 'd'
return 0;
标准未指定字符在 int 中存储的顺序。但是,设计良好的编译器在存储多字符常量时会考虑字节顺序:GCC 和 VisualC 的行为方式相同。
【讨论】:
请注意,C++ 标准不保证这将打印'd'
。 (不过,特定的编译器可能会保证这一点。)
查看我编辑的答案。以上是关于允许使用多个字符进行 C++ 字符初始化 [重复]的主要内容,如果未能解决你的问题,请参考以下文章