这是c代码:
int main(int argc, const char *argv[])
{
printf("%d", '0/');
return 0;
}
输出为12335!然后我尝试将'0 /'替换为'00'和'000',输出变为12336和3158064,而12336 = 48 *(1 + 2 ^ 8),3158064 = 48 *(1 + 2 ^ 8 + 2 ^ 16)。但是,我还是不知道为什么。当'0 /'转换为输出的整数时会发生什么?
PS:我的电脑是MBP,操作系统是OS X 10.9.5(13F34)。编译器是Apple LLVM 6.0。
答案 0 :(得分:3)
您构建了一个"多字符文字"。行为是实现定义的,但在您的情况下,整数值是由ASCII值构成的(12235 == 48 * 256 + 47)。
答案 1 :(得分:2)
'0/'
是一个多字符常量,这意味着它具有实现定义的值。在您的情况下,字符的ASCII值为0x30 0x2f
。这些组合成0x302f
,等于12335。
答案 2 :(得分:2)
因为0/
是int
类型的多字符常量。用它初始化2x3缓冲区的第一部分,并将其传递给printf
以重新解释为int
,第一个字节'0'
乘以256然后第二个字节字节'/'
被添加到其中。这会产生您看到的值:
printf("%d %d %d", '0', '/', '0'*256+'/');
打印
48 47 12335
请注意,此行为与系统有关。在其他系统上,您可以看到12080
而不是12335
。
有关多字符常量的更多信息,请参阅this answer。