[误区] A*=B 不等价于 A=A*B (此贴主要表达C语言对上述两式的不同处理方式将导致的错误,主题非宏定义规范问题)
很多C语言书籍告诉大家,A*=B 等价于 A=A*B ,其实这句话并不完全对。为什么?你是不是好奇了?在写程序时,经常按照自己的逻辑去写,似乎都是对的,但程序的结果却并非预期。于是反反复复检查代码,实在也找不出什么地方错了。只要你是经常写程序的,难免会遇到这种情况,比如你用A*=B来表达A=A*B,在遇到不等价的时候(马上我就为大家揭晓),特别是这句话在上万行程序中时,你就会崩溃的,因为编译器不会报错(非语法错误)。
可能大家猜到了,我就是上述情况的受害者之一,也恰恰是被这个坑的。我承认我是悲剧。
请看如下代码:
#include "stdio.h"
#define Hong01 5 /*写程序,经常会定义宏,方便修改*/
#define Hong02 Hong01+100
int main()
{
int a=2;
a=a*Hong02; /* 替换成 a*=hong02 */
printf("%d\n",a);
return 1;
}
为什么会出现这个问题?我相信你心中已经有了答案。
·······································
有人指出这种错误是出自程序员“宏定义不规范”,大家可以这么认为。因为这的确能成为一个“宏定义不规范”的好例子。
这篇帖子我所要表达的意思是:这两种写法不等价。
我当时以为 C编译器是将表达式 A*=B 转换成 A=A*B ,然后进行计算赋值。前者写法只是为了方便而已。
而事实上,C编译器对于表达式 A*=B 的处理,是先将等号右边看作一个整体进行处理。
这就是我要表达的意思,即表达式 A*=B 并不等价于 A=A*B ,因为C编译器对它们的处理方式的确不一样。
[ 本帖最后由 hackerjiang 于 2010-4-24 23:15 编辑 ]