2013-10-28 13 views
12

所以我碰到這段代碼:這種無支架/無支架的代碼是如何有效的?

%:include <stdio.h> 

int main(int argc, char *argv<::>) <% 
    printf("C program succesfully running..."); 
    getchar(); 

    return 0; 
%> 

這是一些編譯器錯誤,或者這是新的東西,因爲它沒有任何問題我運行尚未發現。

+0

爲什麼無支架編碼是一個問題?令人難以置信的事情是無支撐的代碼 – Cruncher

回答

14

該代碼使用了C有向圖,爲解釋在這裏:http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C

C標準(ISO/IEC 9899:201X,標點符號§6.4.6:3)具有本就此事說:

在語言的各個方面,六代幣

<: :> <% %> %: %:%: 

的行爲,分別,同爲六代幣

[ ] { } # ## 

除了拼寫。

+0

有趣的是,感謝您的鏈接,現在都是有道理的! – Houssni

+0

爲什麼要這樣做?! –

+1

@PeterMiehle從這個答案的鏈接:'鍵盤可能沒有鍵來覆蓋整個字符集的語言' – Houssni

2

這些標點符號和%:相同#%>相同}等... C99 draft standard部分6.4.6標點符號說:

在語言的各個方面, 6 tokens67)

<: :> <% %> %: %:%: 

的行爲,分別,同爲六代幣

[ ] { } # ## 

他們有時也被吹罰爲有向圖正如我們在附註67看到:

這些令牌有時被稱爲''有向圖''。

2

這是C語言的一個非常禪的小角落。

在過去,終端和鍵盤通常不支持編程所需的所有字符;所以引入了digraphs和trigraphs。

我很驚訝任何現代編譯器仍然支持它們,但它是。

2

Digraph,在C99中引入。

C99 6.4。6個標點符號

在語言的所有方面中,六個令牌

<: :> <% %> %: %:%: 

的行爲,分別相同的六個令牌

[ ] {} # ## 

除了它們的拼寫。