自增自减操作符在C与C++中的左值区别

博客讨论了C和C++中自增自减操作符的区别,特别是在左值方面的差异。华为面试题中,表达式C `(a++) += a;` 在C++中错误但在C中与D `(++a) += (a++);` 同样错误。《C和指针》和《C++ Primer》的描述揭示了前缀和后缀自增自减操作符的工作原理,前缀返回的是修改后的左值,而后缀返回的是原始的右值,这解释了为何某些表达式在不同语言环境下行为不一致。

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

今天网上看到一个华为的面试题目:


写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值

int a = 4;

(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);


答案是C是错误的,而A B D是正确的。

我感到很疑惑,于是敲代码验证下,在C++中,确实答案是C不正确。但是在C中,C与D都是错误的。这就非常奇怪了,为什么会这有这样的区别,原因在什么地方呢?

想要知道答案,只能求助于经典书籍了。微笑


C部分

在《C和指针》5.1 操作符中,有这么一段描述:

int a, b, c, d;

...

a = b = 10;                  a和b得到值10

c = ++a;                      a增加到11,c得到的值为11

d = b++;                       b增加到11,d得到的值为10

抽象地说,前缀和后缀形式的增值操作符都是复制一份变量值的拷贝。用于周围表达式的值正是这份拷贝(在上面的例子中,周围表达式是指赋值操作)。前缀操作符在进行复制之前增加变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值