为什么`++ a ++`不是用C ++编译而是`(++ a)++`呢?

时间:2014-11-19 16:07:01

标签: java c++ lvalue rvalue

标题是什么。对于C ++,(++a)++确实编译。但奇怪的是,++(a++)没有:

int main() {
    int a = 0;
    ++a++; // does not compile
    (++a)++; // does compile
    ++(a++); // does not compile
}

但是在Java中,它并不适用于所有三种:

public class Test {
    public static void main(String[] args) {
        int a = 0;
        ++a++; // does not compile
        (++a)++; // does not compile
        ++(a++); // does not compile
    }
}

有没有理由为什么C ++会编译它而不是用Java编写?

1 个答案:

答案 0 :(得分:11)

这些示例都不适用于Java,因为后缀和前缀增量操作都返回而不是变量我们可以通过转到JLS部分来看到这一点Postfix Increment Operator ++举了一个例子,它说:

  

后缀增量表达式的结果不是变量,而是值。

Prefix Increment Operator ++的JLS部分说了同样的话。

这就像尝试增加文字值( see it live ):

2++ ;
++3 ;

会出现以下错误:

required: variable
found:    value

我们收到的与您的示例相同的错误。

在C ++中,前缀增量返回一个左值,但后缀增量返回一个prvalue,C ++中的前缀和后缀增量都需要一个左值。所以你的第一个和第三个C ++例子:

++a++;
++(a++)

失败,因为您尝试将前缀增量应用于prvalue。而第二个C ++示例:

(++a)++;

没关系,因为前缀增量返回一个左值。

作为参考,5.2 Postfix表达式部分中的draft C++ standard说:

  

后缀++表达式的值是其操作数的值[...]操作数应该是可修改的左值

  

结果是prvalue

和部分5.3 一元表达式表示:

  

前缀++的操作数被修改[...]   操作数应是可修改的左值

  

结果是更新的操作数;这是一个左值