为什么没有 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;

在这种情况下,副作用是赋值运算符。