为什么这个C ++代码会编译?

时间:2011-01-12 23:17:19

标签: c++ compiler-construction

有人可以向我解释为什么以下代码编译?是否被编译器忽略了?

#include <stdio.h>
int main() {
    1234;
    return 0;
}

7 个答案:

答案 0 :(得分:8)

标准要求实施者允许陈述,即使没有明显效果。这主要是因为通过宏和模板的魔力,它们出人意料地容易出现。

答案 1 :(得分:5)

此代码没有任何问题。这完全合法。它没有做任何事情,但它完全合法。您的编译器 - 使用正确的警告设置 - 可能会警告您它完全没用,但它完全符合。

答案 2 :(得分:3)

一个好的编译器会给你一个警告,告诉你有一个没有副作用的语句(有效的是null语句),但是在C / C ++中允许使用null语句,所以不会出现编译错误。

答案 3 :(得分:3)

您可以将语句1234;视为与语句getc();类似,因为两个语句都“返回”(评估为)一个值,但返回值没有任何操作。 getc()调用具有从标准输入中消耗字符的副作用,因此您更有可能在程序中看到它而不是裸数。但两者都是合法的。

DeadMG很好地说明为什么允许这样做是个好主意。这不是因为1234可能被定义为宏(因为据我所知,这是不允许的)。这是因为,特别是对于更复杂的宏,很容易得到一个宏,这可能会减少到一些不做任何事情的声明。

答案 4 :(得分:3)

在C(以及C ++)中, 表达式是一个语句 ,即使结果被丢弃,也会对其副作用进行评估。如果它没有任何副作用,编译器可能会发现并优化它(很可能在你的情况下),但它仍然必须编译代码。

当然,如果未明确禁用该警告,任何编译器都会发出警告。

答案 5 :(得分:1)

打开警告。
将警告设置为错误(通常是这样)。

现在它将按照您的预期行事:

> cat t.cpp
int main() {
    1234;
    return 0;
}
> g++ t.cpp -Wall -Wextra -pedantic -Werror
cc1plus: warnings being treated as errors
t.cpp: In function ‘int main()’:
t.cpp:2: warning: statement has no effect

它只是默认的编译器设置是lax

答案 6 :(得分:0)

因为1234是常数,所以它可以让你逃脱它。用'x'替换它(不声明变量x)或'This is not compile'应该导致它失败。

基本上它是一个空的陈述,所以没有任何伤害没有犯规,它会丢弃代码并继续前进。