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 元表达式部分说:
前缀++的操作数被修改[...]操作数应该是可修改的左值
和:
结果是更新的操作数; 这是一个左值
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |