且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《编写高质量代码:改善c程序代码的125个建议》——建议16-2:尽量避免编写多用途的、太复杂的复合表达式

更新时间:2022-03-18 05:35:18

本节书摘来自华章计算机《编写高质量代码:改善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;