为什么没有LHS的乘法在C中有效?

时间:2017-01-31 21:34:14

标签: c compiler-construction lalr

为什么这段C代码有效?

int main() {
    int x = 0, y = 0;

    x * y; // See this?!
}

解释解析器中反向跟踪需求的最普遍的例子经常表明这一点。然后继续说,根据x的内容,*的含义会发生变化。有一段时间,我认为这只是一种解释方式,直到我编译它并发现我的惊讶,它编译并运作!

为什么没有LHS的乘法在C中有效,它用于什么?

修改 这种混淆是因为,同一段代码不能用Java编译。似乎Java编译器试图阻止没有LHS的操作。

enter image description here

2 个答案:

答案 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;

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