本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第2章,建议16-2,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
建议16-2:尽量避免编写多用途的、太复杂的复合表达式
C语言中的复合表达式是指如 a = b = c = 0这样的表达式,它不仅书写简洁,还可以提高编译效率,所以在专业的C程序中经常可以看到。接下来看这样一个例子:
int a=10;
a+=a-=a*=a;
printf("%d\n",a);
有过面试经历的读者看上面的代码应该比较眼熟,笔者也曾经见过多家企业将本题作为面试题,那么a的值究竟应该是多少呢?
由于赋值运算符号是从右向左结合的,因此可以将表达式写成如下形式:
a+=a-=a*=a;
等价于a=a+(a-=a*=a);
等价于a=a+(a=a-(a*=a));
等价于a=a+(a=a-(a=a*a));
根据表达式a=a+(a=a-(a=a*a)),可以将其拆成如下3步分别进行计算:
a=a*a; // a等于100
a=a-a; // a等于0
a=a+a; // a还是等于0
因此,表达式a+=a-=a*=a 所得到的结果为0。
从上面的示例可以看出,虽然复合表达式可以提高编译效率,但是太复杂的复合表达式就适得其反了。同时,还应该避免编写有多用途的复合表达式,例如:
d = (a = b + c) * e ;
该表达式既求a的值又求d的值,应该将其拆分为两个独立的语句,代码如下:
a = b + c;
d = a * e;