我發現了一個奇怪的輸出,當我寫的很簡單的方法,下面幾行:打印??和!在不同的序列會表現出不同的輸出
代碼:
printf("LOL??!\n");
printf("LOL!!?\n");
輸出:
它甚至發生代碼在MBCS和UNICODE下編譯。
輸出根據「?」的順序而變化和「!」...
任何想法?
我發現了一個奇怪的輸出,當我寫的很簡單的方法,下面幾行:打印??和!在不同的序列會表現出不同的輸出
代碼:
printf("LOL??!\n");
printf("LOL!!?\n");
輸出:
它甚至發生代碼在MBCS和UNICODE下編譯。
輸出根據「?」的順序而變化和「!」...
任何想法?
您可以嘗試
printf("What?\?!\n");
在計算機編程,二合字母和三合都被解釋爲編程語言的一個字符分別爲兩個和三個字符序列。
有些編譯器支持關閉trigraphs的識別選項,或者默認禁用trigraphs,並要求打開它們的選項。有些人可以在遇到源文件中的三字母時發出警告。 Borland提供了一個獨立的程序,即trigraph預處理程序,只有在需要三字符處理時才能使用。
他們被稱爲Trigraph Sequences
??!
是豎條|
的三字符序列。
C/C++預處理器識別trigraphs並用它們的等效字符替換它們。因此,當你的代碼被編譯器看到的時候,trigraphs已經被替換了。
# grepping in the source file:
$ grep printf a.c
printf("foo: ??!");
# grepping the preprocessor output:
$ gcc a.c -trigraphs -E | grep printf | grep foo
printf("foo: |");
所有這些例子都是在字符串中,但應該注意的是trigraph替換髮生**隨處可見**,而不僅僅是字符串。 – 2010-10-05 17:03:13
?? ??!被稱爲trigraph並被替換爲|輸出。檢查這個link
解釋如下:克服只是逃避其中一個問號。 – 2010-10-05 10:39:03
trigraphs的最好的部分是,如果你不知道他們被稱爲什麼,它是不可能的搜索它們。 :-)(當被問到「??」時,Google並沒有太大的幫助) – 2010-10-05 11:48:07
@JamesMcNellis尋找'??!'在[SymbolHound](http://www.symbolhound.com/)引導我在這裏:) – 2012-04-09 09:54:34