为什么下面这个程序没有显示任何错误?
int main (void) {
"ANGUS";
1;
3.14;
return 0;
}
答案 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,你希望找到所有参考文献"对于枚举,您可以在一行上用枚号终止枚举,您可以使用上下文菜单查找引用。