2014-05-23 124 views
5

我遇到了一些奇怪的代碼。它甚至不像C,但令我驚訝的是它編譯並運行在我的C編譯器上。這是對C語言的非標準擴展嗎?如果是這樣,它的原因是什麼?這些奇怪的問號是什麼意思?

??=include <stdio.h> 

int main() 
??< 
    const char arr[] = 
    ??< 
    0xF0 ??! 0x0F, 
    ??-0x00, 
    0xAA ??' 0x55 
    ??>; 

    for(int i=0; i<sizeof(arr)/sizeof(*arr); i++) 
    ??< 
    printf("%X??/n", (unsigned char)arr??(i??)); 
    ??> 

    return 0; 
??> 

輸出:

FF 
FF 
FF 
+0

這是我邁向混淆的第一步。我不認爲很多C編碼人員都知道這一點。 – Abhineet

+2

[C++代碼中\'??? - \'的含義]的可能重複(http://stackoverflow.com/questions/16662276/meaning-of-in-c-code) – usr2564301

+1

您應該重構看起來像這個。一個快速的方法是用「??=」代替「?? =」,在其上運行gcc -trigraph -E,然後用「#」替換輸出中的「??=」,同時刪除前幾行由gcc輸出。 –

回答

11

的代碼是完全符合標準的C標準的任何版本。 ??機制被稱爲trigraphs並且被引入到C以允許打印某些符號的替代方式。它看起來像程序是爲了演示各種三字母序列。

當時,許多計算機及其鍵盤都是基於一個名爲ISO 646的舊符號表,它不包含C語言中使用的所有符號,如\ { } [ ]。這使一些國家的程序員甚至無法編寫C語言,因爲他們的國家鍵盤佈局缺乏必要的符號。 C語言改變了,而不是重新制作鍵盤和符號表。

因此引入了trigraphs。今天,它們被認爲是完全過時的功能,不建議使用它們。例如,如果你使用GCC,GCC會給你一個警告。儘管如此,它們仍然保持在C標準中,以實現向後兼容性,所有C編譯器都必須支持它們。

現有三字符序列(C11 5.2.1.1三字符序列):

??= # 
??( [ 
??/ \ 
??) ] 
??'^
??< { 
??! | 
??> } 
??- ~ 

左列是三字符序列和右列是它的意義。