标题是什么。对于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编写?
答案 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
一元表达式表示:
前缀++的操作数被修改[...] 操作数应是可修改的左值
和
结果是更新的操作数;这是一个左值