2011-07-07 86 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语法没有改变的原因。 –