为什么我可以使用常量作为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参考。