C 字符初始化允许多个字符



在了解C 时,通过阅读一本书,我已经看到了这本书(对我)奇怪的代码行。

char ch('AB'); // Or char ch = 'AB';

对我来说这很奇怪,因为我不明白您可以分配给char多个"字母"而无需任何例外。

cout << "Characters in ch: " << ch << endl; // Output B

为什么这起作用?它在内部如何工作?它只是保存最后一个字符而忽略其他字符吗?

它被称为多章字面,它是完全有效的C :

多小节字面文字,例如'AB',具有int类型和实现定义的值。

[...]

许多实现多章文字的实现都使用文字中每个字符的值来初始化所得整数的连续字节,例如,以大型顺序,例如'1234'的值是0x01020304

对我来说这很奇怪,因为我不明白您可以分配一个char多个"字母"而无需任何例外。

您应该将其视为类型转换(演示):

#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中的顺序。但是,设计良好的编译器将在存储多字符常数时考虑Endianness:GCC和Visualc的行为相同。

最新更新