该程序编译(带有diab的C):
int main()
{
("----");
}
答案 0 :(得分:4)
它编译的原因与1;
,"----";
或1 + 2 + 3 + 4;
编译的原因相同:因为表达式后跟分号是有效的语句。
需要使用分号将表达式转换为带有分号的语句才能使C的很多部分工作。例如:
do_stuff_to(x);
是一个函数调用,它有一个值,但它本身可以作为一个语句。
甚至像
这样的东西x = y;
(即分配)实际上是一个表达式。特别是这一点在陈述中非常有用。
C grammar的相关部分是:
statement
: labeled_statement
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
也就是说,statement
可以是众多内容之一,包括expression_statement
;和
expression_statement
: ';'
| expression ';'
;
也就是说,expression_statement
是分号或expression
,后跟分号。
该程序编译的内容取决于实现。编译器可以自由地将字符串编译到程序的数据段中,或者可以自由地忽略它。在我的机器上,即使没有优化级别,GCC也根本不会将字符串放在已编译的可执行文件中。
编译器也不需要警告这个构造,但GCC会给出标志-Wunused-value
。这种警告有时会很有用,因为这种特殊结构根本没用。
test.c: In function ‘main’:
test.c:2:5: warning: statement with no effect [-Wunused-value]
("----");
^