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

Rya*_*yan 6 c++ java rvalue lvalue

标题说的是什么.对于C++,(++a)++编译.但奇怪的是,++(a++)不是:

int main() {
    int a = 0;
    ++a++; // does not compile
    (++a)++; // does compile
    ++(a++); // does not compile
}
Run Code Online (Sandbox Code Playgroud)

但在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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 11

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

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

前缀增量运算符++的JLS部分说同样的事情.

这就像试图增加一个文字值(见它):

2++ ;
++3 ;
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误:

required: variable
found:    value
Run Code Online (Sandbox Code Playgroud)

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

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

++a++;
++(a++)
Run Code Online (Sandbox Code Playgroud)

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

(++a)++;
Run Code Online (Sandbox Code Playgroud)

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

供参考草案C++标准在部分5.2 后缀表达式表示:

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

和:

结果是一个prvalue

和一5.3 元表达式部分说:

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

和:

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