在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