c++ - 导致错误的后缀和前缀增量

标签 c++ increment postfix-notation prefix-notation

为什么该代码由于错误而无法编译:

#include <iostream>

using namespace std;

int main()
{
    int i = 0; 
    cout << ++(i++) << " " << i << endl;
    return 0;
}

虽然该代码确实可以编译:

#include <iostream>

using namespace std;

int main()
{
    int i = 0; 
    cout << (++i)++ << " " << i << endl;
    return 0;
}

我不明白。从我的角度来看,编译第一个 block 是非常合理的。表达式++(i++) 只是表示取 i,递增它并输出,然后再次递增它。

我不是在询问 int 溢出中的未定义行为。在写这个问题时我根本不知道 r 和 l 值,我也不在乎为什么++i 被认为是左值,但 i++ 不是。

最佳答案

这是因为后自增和前自增运算符返回的值类型不同。后增量的结果是所谓的“右值”,这意味着它不能被修改。但是预增量需要一个可修改的值来增加它!

另一方面,预增量的结果是一个左值,这意味着它可以被后增量安全地修改。

上述规则的原因是后增量需要返回应用增量之前对象的值。顺便说一句,这就是为什么在一般情况下,当用于非内置对象时,后增量被认为比前增量更昂贵。

关于c++ - 导致错误的后缀和前缀增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44977326/

相关文章:

c++ - 查找 Eigen 上失败的静态断言的来源

c++ - 有没有办法摆脱虚拟成员函数的常量

android - 设置自定义值以查找栏

c - 为什么 i =++i 调用未定义的行为?

c++ - 为什么不满足我的 "while"条件?

c++ - 使用修改后的反向波兰表示法求解方程

c++ - 私有(private) friend 运营商的代理类<<

c - l 需要作为增量操作数的值

php - 对 AST(或 RPN)应用分配律 => 析取范式

c++ - 如何在我的 g++ 编译器中满足 C++ 标准版本?