为何自增运算符赋值时未自增?运算结果异常疑问
自增运算符在赋值操作中的行为解析
问题1:为何自增运算符在赋值操作时未对值进行自增?
这是因为后置自增运算符b++的执行逻辑是“先返回变量当前的原值,再对变量进行自增”,而赋值操作会把b++返回的旧值重新赋给变量,直接覆盖掉自增后的结果。
举个具体例子:
int b = 2; b = b++;
执行过程拆解:
- 计算
b++:先取出b的当前值2作为返回结果,随后将b的值加1,此时b变为3; - 执行赋值操作:把
b++返回的2重新赋给b,最终b的值被覆盖为2。
看起来“没有自增”,实际上自增操作已经执行过,但后续的赋值覆盖了结果。如果换成前置自增++b,逻辑会变成“先自增再返回值”,此时b = ++b的结果就是3,不会出现覆盖问题。
问题2:为何int b=2时,b = b++ + b++ + b++结果为9,b = b++ + b++结果为5?
核心还是后置自增的“先用后加”逻辑,加上赋值操作对最终结果的覆盖:
情况1:b = b++ + b++ + b++(初始b=2)
执行步骤:
- 第一个
b++:返回当前值2,b变为3; - 第二个
b++:返回当前值3,b变为4; - 第三个
b++:返回当前值4,b变为5; - 计算加法:2 + 3 + 4 = 9;
- 赋值给b:b被覆盖为9,最终结果是9。
情况2:b = b++ + b++(初始b=2)
执行步骤:
- 第一个
b++:返回当前值2,b变为3; - 第二个
b++:返回当前值3,b变为4; - 计算加法:2 + 3 = 5;
- 赋值给b:b被覆盖为5,最终结果是5。
你预期的6,大概率是混淆了后置自增和前置自增的逻辑,或是错误认为所有自增操作会在加法运算前完成。实际上每个b++都是先取出当前值参与计算,之后才执行自增,而最终的赋值操作会把加法结果覆盖到变量上,因此不会得到“2+4=6”的结果。
补充说明:在早期C/C++标准中,同一表达式内对同一变量多次进行自增/自减操作属于未定义行为,不同编译器可能输出不同结果。但目前主流编译器(如GCC、Clang)已统一执行逻辑,结果相对稳定,但这类写法可读性极差且容易引发错误,实际开发中应尽量避免。
内容的提问来源于stack exchange,提问作者Meezan Malek
相关产品推荐
相关产品推荐

