在C語言編程單語句,可以省略一個代碼塊在單個語句的情況下,例如:語法:函數聲明
if(1) exit();
現在,這是否僅適用於條件句? 這是爲什麼在功能的情況下無效:
void f(int a) exit();
在C語言編程單語句,可以省略一個代碼塊在單個語句的情況下,例如:語法:函數聲明
if(1) exit();
現在,這是否僅適用於條件句? 這是爲什麼在功能的情況下無效:
void f(int a) exit();
這是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這個不太明顯的理由! –
我認爲這是C語法分析器的觀點。因爲在解析器的第二個語句中我沒有看到任何矛盾。但任何方式+1 –
謝謝!這正是我正在尋找的那種答案,並且你提醒我爲什麼我喜歡CS! – overscore
條件語句的語法是:
if(expression) statement
複合語句是一個語句。
甲compound statement
被定義爲
{ zero or more statements }
函數定義的語法是本
function_declaration compound_statement
因此,通過定義一個函數體必須是一個複合語句,並具有{}
QED :)
有C,K個& [R C.一個非常古老的方言在方言這個函數的聲明看起來是這樣的:
fun_a(a,b)
char a;
float b;
{
fun_b(b,a);
}
我認爲它會沒有{
和}
就難以解析它。
這可能是歷史原因+1,但這也是ANSI C語法沒有改變的原因。 –
因爲標準是這樣說的嗎? –
從來沒有嘗試過,但我想,如果它不被允許,這只是一個語法問題,也許是遺留問題:一旦你寫了void f(a)int a; {...},所以{}需要標記參數類型聲明塊的結尾......也許...... – ShinTakezou
謝謝,我知道舊的函數語法,但這也意味着編譯器能夠正確地解析此然後.. – overscore