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

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

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

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

返callback用者可能感兴趣或不感兴趣的值的函数并不less见,例如printf("%d", 9001)返回打印的字符数。 呼叫者可以使用返回的号码,或者他们可以忽略它。

如果编译器在你忽略了一个返回值的时候抱怨,你会有一个非常嘈杂的构build日志。 然而,一些编译器诊断(如果启用了足够的警告标志)文字和variables的无用的副作用较less的使用。

C中的语句完全有效,只是一个被丢弃的值。 大多数人没有意识到,当他们编写如下代码时,会发生这种情况:

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

前者实际上是一个expression式,恰恰在“返回”之后会有增加variables的副作用。

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

从某种angular度来说,这与陈述没有什么不同:

 42; 3 * 12; 

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

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

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

所有这些都在C99的第6.8.3 Expression and null statements节中有详细说明。 6.8.3 Expression and null statements部分地说:

expression式语句中的expression式被评估为其副作用的无效expression式,例如赋值和具有副作用的函数调用。

一个陈述只包含一个expression式是完全有效的。 在你的例子中没有任何东西可以实现,但是完全相同。

由于在C这是一个有效的声明,但是当你使用Java它会给你编译时的错误。

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

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

因为它是有效的。 一个string或数字是一个有效的expression式,而一个expression式后跟分号是一个语句(也被非正式地称为指令)。

它在C ++中也是有效的,并且在Visual Studio中有一个黑客的用法,你希望为一个枚举“查找所有引用”,你可以用一个分号结尾的分号键入一行上的枚举,你可以使用上下文菜单find参考。