为什么这段C代码有效?
int main() {
int x = 0, y = 0;
x * y; // See this?!
}
解释解析器中反向跟踪需求的最普遍的例子经常表明这一点。然后继续说,根据x
的内容,*
的含义会发生变化。有一段时间,我认为这只是一种解释方式,直到我编译它并发现我的惊讶,它编译并运作!
为什么没有LHS的乘法在C中有效,它用于什么?
修改 这种混淆是因为,同一段代码不能用Java编译。似乎Java编译器试图阻止没有LHS的操作。
答案 0 :(得分:4)
它不用于任何东西。
它有效的原因是因为它使语言更简单。表达式本身就是一个有效的语句,所以你可以这样做:
f(x, y);
即使f
的定义是:
int f(int x, int y) {
return x * y;
}
这两者都没有意义,但确切地弄清楚哪些表达“有意义”会使语言变得更复杂。编译器警告我们,这已经足够了:
$ cc -c -Wall -Wextra test.c test.c: In function ‘main’: test.c:3:7: warning: statement with no effect [-Wunused-value] x * y; ~~^~~
答案 1 :(得分:3)
这被称为表达式声明。
来自C standard的第6.8.3节:
1
表达式语句:表达式 opt ;
2 表达式语句中的表达式被计算为其副作用的void表达式。
在您的情况下,表达式是乘法。该声明没有副作用,因此根本没有效果。
如果另一方面你有这个:
i++;
这是一个确实有副作用的表达。
这也被认为是一种表达方式:
a = b * c;
在这种情况下,副作用是赋值运算符。