为什么没有 LHS 的乘法在 C 语言中有效?
Why is a multiplication without an LHS valid in C?
为什么这段C代码有效?
int main() {
int x = 0, y = 0;
x * y; // See this?!
}
解释解析器中回溯需要的最普遍的例子经常表明这一点。然后接着说,根据 x
是什么, *
的含义会发生变化。有一段时间,我认为这只是一种解释方式,直到我编译它并惊讶地发现它可以编译并运行!
为什么没有 LHS 的乘法在 C 中有效?它有什么用?
编辑
这种混淆是因为,同一段代码不会在 Java 中编译。似乎 Java 编译器试图阻止没有 LHS 的操作。
没有任何用途。
它有效的原因是它使语言更简单。表达式本身就是一个有效的语句,因此您可以这样做:
f(x, y);
即使f
的定义是:
int f(int x, int y) {
return x * y;
}
这也没有意义,但准确地弄清楚哪些表达式 "make sense" 会使语言更加复杂。编译器警告我们就足够了:
$ cc -c -Wall -Wextra test.c
test.c: In function ‘main’:
test.c:3:7: warning: statement with no effect [-Wunused-value]
x * y;
~~^~~
这称为 表达式语句。
来自 C standard 的第 6.8.3 节:
1
expression-statement:
expressionopt ;
2 The expression in an expression statement is evaluated as a void expression for its side effects.
在你的例子中,表达式是一个乘法。这个语句没有副作用,所以完全没有作用。
如果另一方面你有这个:
i++;
这是一个确实有副作用的表达式。
这也被认为是一个表达式:
a = b * c;
在这种情况下,副作用是赋值运算符。
为什么这段C代码有效?
int main() {
int x = 0, y = 0;
x * y; // See this?!
}
解释解析器中回溯需要的最普遍的例子经常表明这一点。然后接着说,根据 x
是什么, *
的含义会发生变化。有一段时间,我认为这只是一种解释方式,直到我编译它并惊讶地发现它可以编译并运行!
为什么没有 LHS 的乘法在 C 中有效?它有什么用?
编辑 这种混淆是因为,同一段代码不会在 Java 中编译。似乎 Java 编译器试图阻止没有 LHS 的操作。
没有任何用途。
它有效的原因是它使语言更简单。表达式本身就是一个有效的语句,因此您可以这样做:
f(x, y);
即使f
的定义是:
int f(int x, int y) {
return x * y;
}
这也没有意义,但准确地弄清楚哪些表达式 "make sense" 会使语言更加复杂。编译器警告我们就足够了:
$ cc -c -Wall -Wextra test.c test.c: In function ‘main’: test.c:3:7: warning: statement with no effect [-Wunused-value] x * y; ~~^~~
这称为 表达式语句。
来自 C standard 的第 6.8.3 节:
1
expression-statement:expressionopt ;
2 The expression in an expression statement is evaluated as a void expression for its side effects.
在你的例子中,表达式是一个乘法。这个语句没有副作用,所以完全没有作用。
如果另一方面你有这个:
i++;
这是一个确实有副作用的表达式。
这也被认为是一个表达式:
a = b * c;
在这种情况下,副作用是赋值运算符。