C语言基础巩固——运算符优先级与混合表达式相关
## 效果图示:
关于a++与++a的问题一直是面试以及课堂上老生常谈的问题,但当两者混合并与其他运算符构成新的表达式时,即便是已从业多年的开发人员,突然面对无论是面试题中还是跑路同行留下的“密码”,难免也要挠两下本已稀疏的头。
void main() {
int a = 10;
int b = (a++) + (++a) * 3 + (--a) + (a++);
printf("%d, %d\n", a, b); // 12, 60
b = (++a) + (a++) + (--a);
printf("%d, %d\n", a, b); // 13, 36
getchar();
}
## 执行流程:
首先明确:自增自减运算符先于普通加减运算执行,自增自减的运算顺序为从右往左,有疑问请自查优先级与运算顺序
以第一次赋值为例,右端的表达式执行以下操作:
1:从右向左依次进行--a与++a的运算,内存中a经历 10 --> 9 --> 10 变化
2:使用临时变量temp存储内存中a的值(10)
3:从右向左依次执行a++运算,内存中a经历 10 --> 11 --> 12 变化
4:使用临时变量temp执行后续运算,即 10 + 10 * 3 + 10 + 10 = 60,并最终赋值给b
注:关于第3、4步顺序有待考证,但整个过程应该如上所述
## 一点吐槽:
大家都知道无论是a++与++a单独出现时,表示自增,前者表示先运算后自增,后者表示先自增后运算,虽然工作中用到更多的是单独作为循环的一行或一部分出现,但是面试和考试有时远比这要恶心得多,他们爱考,我们也爱踩,而且工作中不泛有许多爱显摆自己的人,偏爱浓缩代码,关键时刻还是要看得懂。
谨以此文提醒来者:我们写的是代码,不是密码。