关于i++i,i++ = x的一点见解

本文深入探讨了C++中i++与++i的使用及优先级问题,通过具体代码示例,分析了后置++与前置++的执行顺序及编译器报错原因,揭示了自增运算符的原子性特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于i++i,曾在一本书上看过,后置++是一个类似原子操作的不可拆分的过程,系统将后置++看作一个常量来处理。由于当时忘记记录,今日又遇到了类似的问题,于是做一个简单的分析。

关于i+++i:

#include<stdio.h>

int main()
{
    int i = 1;
    int a = i+++i;

    printf("%d",a);

    return 0;
}

上面代码的打印结果是2。说明,当i++与++i同时存在时,默认先编译i++,可以初步理解为后置++优先级高于前置++

 

#include<stdio.h>

int main()
{
    int i = 1;
    (i++) += i;

    return 0;
}

(i++)+ = i;这里会报错,提示(i++)是一个不可修改的左值。那么错误到底出现在哪里呢?

将i++整体看作x,按照我们的理解,这一句将会变成x = x+i,再将x展开,变成了i++ = i+++i。

按照后置++的理解,先将赋值右边的值赋给i,再执行i自加。

有了前一个程序,说明赋值右边的i+++i是可以编译通过的,而且值为2。

那么说明i++ = 2;编译不通过。

经过尝试,编译器同样在i++ = 2;这句报错,同样提示i是一个不可修改的左值。

这一句的执行顺序是先给i赋值再自加,相当于将i++拆开。但由于i++是一个类似原子操作的不可分的整体,所以编译器会报错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值