作者UNARYvvv (有趣生活)
看板C_and_CPP
标题Re: [FAQ&FME] C 语言新手十诫
时间Mon Aug 29 17:52:41 2005
※ 引述《cppguide (洗屁屁)》之铭言:
: ※ 引述《khoguan (Khoguan Phuann)》之铭言:
: : 唉,要了解「十诫」的真谛是很不容易的。
: : 请容我再重述其中与上述问题相关的一条:
: : 「你不可以在一个运算式(expression)中,对一个基本型态的变数
: : 修改其值超过一次以上。」
: : 否则,将导致未定义的後果(undefined behavior).
: 可以请问一下这一条规定 源自那吗?
: 我的K&R那本书找不到耶!!!
: 是在C99中的新的规定嘛 or ............
先别急着说在 K&R 找不到
在 K&R 2e 中
p.53 有提到一些该避免的写法
(<题外话>
例如:
x = f() + g();
如果 f 和 g 都会存取某个变数,则可能有问题
因为 f 和 g 的运算顺序看编译器而定
=> 这也就是很多人对 associativity 的误解
printf("%d %d\n", ++n, power(2,n));
=> "can produce different results with different compilers"
a[i]=i++;
=> 作者说是 "One unhappy situation",很妙~
因为不确定 i 一定是新的值或是旧的
所以我觉得初学者学到一定程度之後,都应该看看 K&R ..
这些问题太常见了,有看过书就会
)
而这一页也提到了 "side effect"
所以应该就大概知道 "side effect" 是什麽意思了
接下来看到 p.89
有一个 macro 的例子:
#define max(A,B) ((A) > (B) ? (A) : (B))
然後 p.90
"The expressions are evaluated twice;
this is bad if they involve side effects
like increment operators or input and output.
For instance,
max(i++, j++) /* WRONG */
will increment the larger value twice."
我想如果有看过这一段的话
应该就可以了解作者的意思吧?很明显了
之前有人问的问题就是同一个 expression 里面
对同一个变数施行 increment opaeator 两次
那刚好符合 p.90 这段文字所讲的情况。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.70.137.117
1F:推 khoguan:谢谢 U大^^ U大对 K&R2 真是精熟无比!220.130.208.168 08/29