字符常量中的多个字符
一些C编译器允许一个字符常量中的多个字符。 这意味着写“是”而不是“是”很可能不被发现。 来源:C陷阱和陷阱
任何人都可以举一个例子,在一个字符常量中允许多个字符?
正如Code Monkey引用的,它是实现定义和实现变化 – 它不只是BigEndian / LittleEndian和charset的区别。 我已经testing了四个实现(全部使用ASCII)的程序
#include <stdio.h> int main() { unsigned value = 'ABCD'; char* ptr = (char*)&value; printf("'ABCD' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value); value = 'ABC'; printf("'ABC' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value); return 0; }
我得到了四个不同的结果
Big endian(AIX,POWER,IBM编译器)
'ABCD' = 41424344 = 41424344 'ABC' = 00414243 = 00414243
Big endian(Solaris,Sparc,SUN编译器)
'ABCD' = 44434241 = 44434241 'ABC' = 00434241 = 00434241
小端(Linux,x86_64,gcc)
'ABCD' = 44434241 = 41424344 'ABC' = 43424100 = 00414243
小端(Solaris,x86_64,Sun编译器)
'ABCD' = 41424344 = 44434241 'ABC' = 41424300 = 00434241
你可以在case语句中使用它,但是我不会推荐它。
'yes'
是一个多字符常量。 它的types是int
,它的值是依赖于实现的。 就像你已经说过的那样,这取决于编译器。
所以int foo = 'yes';
ARM,第2.5.2节,第9页:
“字符常量是用单引号括起来的一个或多个字符,如'x'。”
稍后在同一页上:
“多字符常量的types是int,多字符常量的值是依赖于实现的,例如,'AB'的值可以合理地预期为'A''B'和('A'<< 8)+'B '在三个不同的实现上,通常最好避免多字符常量。
和
从ANSI C规范引用(C ++试图兼容):
3.1.3.4字符常量语义
整型charcter常量的types为int [注意它在C ++中有chartypes] …包含多个字符的整型字符常量的值是实现定义的。
在允许单字符常量的所有上下文中允许使用多字符常量。
至于在哪里实际使用,我已经看到使用多字符常量的代码来创build清晰的唯一值。 例如,假设int是4个字节,“ABCD”和“EFGH”可能是不同的。 (这不是由语言保证的;实现必须logging映射,但不一定合理)。假设一个合理的映射,你可能会在目标代码中看到“ABCD”或“EFGH”。 不是世界上最好的想法,但是如果你不关心可移植性,它可以工作。
顺便说一下, 所有符合的C编译器都支持多字符常量(根据定义,一个不支持它们的编译器是不符合的)。