2014-09-27 55 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

相關問題