为什么我可以在C中使用常量作为语句?

时间:2011-08-24 08:57:55

标签: c

为什么下面这个程序没有显示任何错误?

int main (void) {
    "ANGUS";
    1;
    3.14;
    return 0;
}

7 个答案:

答案 0 :(得分:27)

这些语句中的每一个都是计算值的表达式,然后将其丢弃。 将它与您调用返回int,char或float的函数进行比较,而不使用返回值。这也是一个评估值的表达式。

让函数返回调用者可能感兴趣或不感兴趣的值的情况并不少见,例如printf("%d", 9001)返回打印的字符数。调用者可以使用返回的数字,也可以忽略它。

如果编译器在您忽略返回值时抱怨,则您的构建日志会非常嘈杂。然而,有些编译器会诊断(如果启用了足够的警告标志),那么文字和变量的无副作用就会毫无用处。

答案 1 :(得分:16)

C中的语句只是一个被丢弃的值,这是完全有效的。大多数人都没有意识到这正是他们编写代码时所发生的事情:

x++;
printf ("Hello, world\n");

前者实际上是一个表达式,它恰好具有在“返回”它之后递增变量的副作用。

后一个函数调用实际上返回一个值(打印的字符数),它也被丢弃。

从某个角度来看,这与陈述没有什么不同:

42;
3 * 12;

除了它们没有副作用使它们有用之外的事实。

实际上,即使x = 1也是一个表达式,其中结果被丢弃。正是这使得x = y = z = 0成为可能,因为这是有效的:

(x = (y = (z = 1)));

所有这一切都在C99,6.8.3 Expression and null statements部分详细说明,部分内容如下:

  

表达式语句中的表达式被计算为其边的void表达式   效果,例如赋值和具有副作用的函数调用。

答案 2 :(得分:9)

对于只包含表达式的语句,它是完全有效的。在你的例子中没有做到这一点,但它完全有效。

答案 3 :(得分:5)

因为在c中它是一个有效的语句,但是当你使用java时它会给你编译时错误。

答案 4 :(得分:4)

为什么要这样?你主要的前三行不做任何事情并返回0;是一个有效的表达。

如果使用gcc编译程序,请尝试启用所有警告(使用-Wall参数)。这将打印warning: statement with no effect [-Wunused-value]

答案 5 :(得分:2)

因为它有效。字符串或数字是有效的表达式,后跟分号的表达式是一个语句(也非正式地称为指令)。

答案 6 :(得分:0)

它在C ++中也有效,并且它确实在Visual Studio中使用了一个hackish,你希望找到所有参考文献"对于枚举,您可以在一行上用枚号终止枚举,您可以使用上下文菜单查找引用。