2014-09-27 80 views
1

这是C代码:为什么“printf(”%d“,'0 /');”是12335?

int main(int argc, const char *argv[]) 
{ 
    printf("%d", '0/'); 
    return 0; 
} 

输出是12335!然后我尝试用'00'和'000'代替'0',输出变为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。

+1

你是不是指'\ 0'? – matsjoyce 2014-09-27 20:36:20

+0

即使是一个基本问题,如果OP增加了一件事情,我会给出一个几乎完美形式的第一个问题的+1:预期的输出。考虑未来的问题。 – chux 2014-09-27 23:34:20

回答

3

您已构建“多字符文字”。该行为是实现定义的,但在您的情况下,整数值是从ASCII值(12235 == 48 * 256 + 47)构造的。

2

'0/'是一个多字符常量,这意味着它有一个实现定义的值。在你的情况下,字符的ASCII值是0x30 0x2f。这些合并为0x302f,等于12335.

2

因为0/int类型的多字符常量。您用它初始化2x3缓冲区的第一部分,并将其传递到printf以重新解释为int,第一个字节'0'乘以256,然后将第二个字节'/'添加到它。这将产生您看到的值:

printf("%d %d %d", '0', '/', '0'*256+'/'); 

打印

48 47 12335 

demo

请注意,此行为是依赖于系统的。在其他系统上,您可以看到12080而不是12335。有关多字符常量的更多信息,请参阅this answer

+0

@ouah你说得对,多字符字符是'int'。 – dasblinkenlight 2014-09-27 20:41:28

相关问题