我很好奇我能否编译
int map [] = { [ /*(unsigned char)*/ 'a' ]=1 };
Run Code Online (Sandbox Code Playgroud)
不论平台如何,还是unsigned char在使用字符常量作为索引之前将其转换为更好。
如果字符常量int基于基本执行时字符集的成员,则它是的正值。
由于a该字符集位于该基本字符集中,因此我们知道该'a'值必须是肯定的。
另一方面,例如,'\xFF'可能不是肯定的。该FF值将被视为char†的位模式,可以对其进行签名,由于二进制补码,因此为-1。如果我们使用与type的负值相对应的字符(而不是与char8位系统上的0x80-0xFF字节范围相对应的字符)代替数字转义,则将应用类似的推理。
就像在ANSI C89和C90中那样,我依赖于内存。但是这些要求在新的草案和标准中仍然存在。在n1570草案中,我们具有以下各项:
6.4.4.4字符常量,第10段:“如果整数字符常量包含单个字符或转义序列,则其值是将类型为char的对象的值转换为单个字符或转义序列的值时得出的值输入int。”
6.2.5类型,第3段:“如果基本执行字符集的成员存储在char对象中,则其值必须保证为非负数。”
字符常量不是“ char对象”,但是6.4.4.4中的要求指定了使用以下char表示形式确定字符常量的值:“ ...当对象的类型为char且其值是...时产生的值”。
†无前缀字符常量的数字转义序列和带前缀的数字常量L具有关联的“对应类型”,该类型是无符号的,并且必须在该类型的范围内(6.4.4.4 9)。想法是将字符值指定为无符号值,该值给出它们的按位表示,然后将其解释为char。实例2(6.4.4.4 13)中也传达了这一意图。