2010-10-05 52 views
5

我發現了一個奇怪的輸出,當我寫的很簡單的方法,下面幾行:打印??和!在不同的序列會表現出不同的輸出

代碼:

printf("LOL??!\n"); 
printf("LOL!!?\n"); 

輸出: alt text

它甚至發生代碼在MBCS和UNICODE下編譯。

輸出根據「?」的順序而變化和「!」...

任何想法?

+0

解釋如下:克服只是逃避其中一個問號。 – 2010-10-05 10:39:03

+3

trigraphs的最好的部分是,如果你不知道他們被稱爲什麼,它是不可能的搜索它們。 :-)(當被問到「??」時,Google並沒有太大的幫助) – 2010-10-05 11:48:07

+0

@JamesMcNellis尋找'??!'在[SymbolHound](http://www.symbolhound.com/)引導我在這裏:) – 2012-04-09 09:54:34

回答

5

您可以嘗試

printf("What?\?!\n"); 

在計算機編程,二合字母和三合都被解釋爲編程語言的一個字符分別爲兩個和三個字符序列。

有些編譯器支持關閉trigraphs的識別選項,或者默認禁用trigraphs,並要求打開它們的選項。有些人可以在遇到源文件中的三字母時發出警告。 Borland提供了一個獨立的程序,即trigraph預處理程序,只有在需要三字符處理時才能使用。

16

??!是被|取代的trigraph

通常,您不應將兩個問號字符放在源文件的任何位置。

+0

http://en.wikipedia.org/wiki/Digraphs_and_trigraphs – ereOn 2010-10-05 10:08:45

+1

或其他任何地方,爲此。 :) – jalf 2010-10-05 14:28:24

+0

@jalf:我希望ANSI C委員會遵守了你的規則...... ;-) – 2010-10-05 17:02:35

5

他們被稱爲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: |"); 
+0

所有這些例子都是在字符串中,但應該注意的是trigraph替換髮生**隨處可見**,而不僅僅是字符串。 – 2010-10-05 17:03:13

4

?? ??!被稱爲trigraph並被替換爲|輸出。檢查這個link

2

這是一個字符串常量中特殊的字符序列,具有特殊的含義。由於並非所有終端都支持某些字符,所以稱它們最初實現的三字母。

+1

......現在,它們只是爲了使編程更有趣而實現。:) – 2010-10-05 10:20:08

+0

@DevSolar:???你的評論意味着什麼? – Hogan 2010-10-05 16:25:32

+0

@Matteo:是的。編程是沒有意思的。 – Hogan 2010-10-05 16:28:26

相關問題