为什么括号中的字符串会编译并编译为什么?

时间:2016-10-21 00:18:06

标签: c

该程序编译(带有diab的C):

int main()
{

    ("----");
}
  • 为什么不将其视为编译错误? (是否因为它支持需要此语法的其他功能)?
  • 它编译成什么?

1 个答案:

答案 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]
     ("----");
     ^