2011-07-07 108 views
8

在C語言編程單語句,可以省略一個代碼塊在單個語句的情況下,例如:語法:函數聲明

if(1) exit(); 

現在,這是否僅適用於條件句? 這是爲什麼在功能的情況下無效:

void f(int a) exit(); 
+4

因爲標準是這樣說的嗎? –

+1

從來沒有嘗試過,但我想,如果它不被允許,這只是一個語法問題,也許是遺留問題:一旦你寫了void f(a)int a; {...},所以{}需要標記參數類型聲明塊的結尾......也許...... – ShinTakezou

+0

謝謝,我知道舊的函數語法,但這也意味着編譯器能夠正確地解析此然後.. – overscore

回答

18

這是C語法的特點。在BNF,函數定義是一樣的東西

FUNC_DEF ::= TYPE IDENTIFIER "(" PARAM_LIST ")" BLOCK 

而語句是

STATEMENT ::= (EXPRESSION | DECLARATION | CONTROL |) ";" | BLOCK 
BLOCK ::= "{" STATEMENT* "}" 

(簡化允許混雜的聲明和陳述,C++允許,但C沒有),以及if聲明是

CONDITIONAL ::= "if" "(" EXPRESSION ")" STATEMENT 

現在省略了else部分。

造成這種情況的原因,否則,您可以編寫功能

void no_op() {} 

void no_op(); 

但後者的語法已經被使用來表示一個聲明。

+1

+1這個不太明顯的理由! –

+0

我認爲這是C語法分析器的觀點。因爲在解析器的第二個語句中我沒有看到任何矛盾。但任何方式+1 –

+0

謝謝!這正是我正在尋找的那種答案,並且你提醒我爲什麼我喜歡CS! – overscore

4
  • 條件語句的語法是:

    if(expression) statement 
    
  • 複合語句是一個語句。

  • compound statement被定義爲

    { zero or more statements } 
    
  • 函數定義的語法是本

    function_declaration compound_statement 
    
  • 因此,通過定義一個函數體必須是一個複合語句,並具有{}

  • QED :)

1

有C,K個& [R C.一個非常古老的方言在方言這個函數的聲明看起來是這樣的:

fun_a(a,b) 
char a; 
float b; 
{ 
     fun_b(b,a); 
} 

我認爲它會沒有{}就難以解析它。

+0

這可能是歷史原因+1,但這也是ANSI C語法沒有改變的原因。 –