| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2647 人关注过本帖, 1 人收藏
标题:[误区] A*=B 不等价于 A=A*B (此贴主要表达C语言对上述两式的不同处理方 ...
只看楼主 加入收藏
hackerjiang
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:3
帖 子:780
专家分:111
注 册:2007-4-27
结帖率:100%
收藏(1)
 问题点数:0 回复次数:26 
[误区] 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 编辑 ]
搜索更多相关主题的帖子: C语言 误区 定义 主题 不等价 
2010-04-22 19:07
ychf890225
Rank: 4
等 级:业余侠客
帖 子:85
专家分:221
注 册:2010-4-15
收藏
得分:0 
在A有初值的情况下应该等价吧?
2010-04-22 19:11
hackerjiang
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:3
帖 子:780
专家分:111
注 册:2007-4-27
收藏
得分:0 
回复 2楼 ychf890225
刚才代码有误,不好意思,改了

(づ ̄ 3 ̄)づ
2010-04-22 19:16
aufish
Rank: 2
等 级:论坛游民
威 望:1
帖 子:59
专家分:94
注 册:2010-4-22
收藏
得分:0 
对,a有初值,不给初值输出有好多种。并且你把子return都拼错了
2010-04-22 19:17
hackerjiang
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:3
帖 子:780
专家分:111
注 册:2007-4-27
收藏
得分:0 
回复 4楼 aufish
不还意思,刚才代码发错了,改正后我们赋予 a初值 为2

(づ ̄ 3 ̄)づ
2010-04-22 19:19
ychf890225
Rank: 4
等 级:业余侠客
帖 子:85
专家分:221
注 册:2010-4-15
收藏
得分:0 
哦,原来这样啊。知识!加个括号貌似就好了!
2010-04-22 19:20
zhecool
Rank: 2
等 级:论坛游民
帖 子:8
专家分:39
注 册:2010-3-31
收藏
得分:0 
自己敲了代码再运行一下,终于发现是怎么一回事了
嗯!这个……不知道应该是误区呢还是BUG,不过算是了解了!
2010-04-22 19:44
liyang0430
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:98
专家分:159
注 册:2009-6-9
收藏
得分:0 
我用tc编译了下 ,a*=a比a=a*a正确率要高!顶楼主!
2010-04-22 20:00
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
收藏
得分:0 
这样不行,要加个括号。楼主的其实是a=a*hong01+100 那就是a=2*5+100=110
 a*=ahong01 是把后面看成一个整体  如果把hong02改成=100+a*hong01  值又会改变  我估计可能是BUG把 我真三的时候经常张飞两个玄武一起开  最后不受控制
2010-04-22 21:21
h646028147
Rank: 2
等 级:论坛游民
帖 子:33
专家分:23
注 册:2010-4-12
收藏
得分:0 
九楼正解呀
2010-04-23 07:50
快速回复:[误区] A*=B 不等价于 A=A*B (此贴主要表达C语言对上述两式的不同处 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012509 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved