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

(づ ̄ 3 ̄)づ
2010-04-22 19:16
hackerjiang
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:3
帖 子:780
专家分:111
注 册:2007-4-27
收藏
得分:0 
回复 4楼 aufish
不还意思,刚才代码发错了,改正后我们赋予 a初值 为2

(づ ̄ 3 ̄)づ
2010-04-22 19:19
hackerjiang
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:3
帖 子:780
专家分:111
注 册:2007-4-27
收藏
得分:0 
回复 21楼 jmjy
我当时以为 C编译器是将表达式 A*=B 转换成 A=A*B ,然后进行计算赋值。前者写法只是为了方便而已。
而事实上,C编译器对于表达式 A*=B 的处理,是先将等号右边看作一个整体进行处理。
这就是我要表达的意思,即表达式 A*=B 并不等价于 A=A*B ,因为C编译器对它们的处理方式的确不一样。

当然,这也能成为一个“宏定义不规范”的好例子。

(づ ̄ 3 ̄)づ
2010-04-24 23:07
快速回复:[误区] A*=B 不等价于 A=A*B (此贴主要表达C语言对上述两式的不同处 ...
数据加载中...
 
   



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

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