Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

簡單的前置、後置運算??

0 views
Skip to first unread message

news.hinet.net

unread,
Nov 8, 2001, 9:17:49 AM11/8/01
to
int a = 7;
printf("%d %d %d\n", a, a++, a);
printf("%d %d %d\n", a, ++a, a);
printf("%d %d %d\n", a, a--, a);
printf("%d %d %d\n", a, --a, a);

以上的結果我是寫:
7 7 8
8 9 9
9 9 8
8 7 7

但電腦結果卻是:
7 7 7
9 9 8
9 9 9
7 7 8

那個才對啊?不是說 ++a 為先加,而 a++ 是先取用?

John Lin

unread,
Nov 9, 2001, 12:15:00 AM11/9/01
to
"news.hinet.net" 撰寫

問題是 C 並不保證逗點運算元是由左而右順序計算
最佳化方法不同會造成不同結果,例如


> printf("%d %d %d\n", a, a++, a);

> 7 7 7
順序可能是 1->3->2 (a, a, 再 a++) 或 3->1->2

> printf("%d %d %d\n", a, ++a, a);

> 9 9 8
順序是 3->2->1

> printf("%d %d %d\n", a, a--, a);

> 9 9 9
順序可能是 1->3->2 或 3->1->2

> printf("%d %d %d\n", a, --a, a);

> 7 7 8
順序是 3->2->1

所以嚴格說起來 printf("%d %d %d\n", a, --a, a); 的寫法是
有 bug 的程式,應該要避免

John Lin


melody

unread,
Nov 9, 2001, 10:20:36 AM11/9/01
to
> > int a = 7;
> > printf("%d %d %d\n", a, a++, a);
> > printf("%d %d %d\n", a, ++a, a);
> > printf("%d %d %d\n", a, a--, a);
> > printf("%d %d %d\n", a, --a, a);
> >
> > 以上的結果我是寫:
> > 7 7 8
> > 8 9 9
> > 9 9 8
> > 8 7 7
> >
> > 但電腦結果卻是:
> > 7 7 7
> > 9 9 8
> > 9 9 9
> > 7 7 8
> >
> > 那個才對啊?不是說 ++a 為先加,而 a++ 是先取用?
>
> 問題是 C 並不保證逗點運算元是由左而右順序計算
> 最佳化方法不同會造成不同結果,例如
> > printf("%d %d %d\n", a, a++, a);
> > 7 7 7
> 順序可能是 1->3->2 (a, a, 再 a++) 或 3->1->2
> .......................... 略

> 所以嚴格說起來 printf("%d %d %d\n", a, --a, a); 的寫法是
> 有 bug 的程式,應該要避免


所以也是說,當 "," 運算元是不保證由前往後 ( 左 -> 右 ) 的方式計算囉?

伸羅

unread,
Nov 9, 2001, 11:14:45 AM11/9/01
to
==> 在 "melody" <melod...@msa.hinet.net> 的文章中提到:

> > 問題是 C 並不保證逗點運算元是由左而右順序計算
> > 最佳化方法不同會造成不同結果,例如
> > 順序可能是 1->3->2 (a, a, 再 a++) 或 3->1->2
> > .......................... 略
> > 所以嚴格說起來 printf("%d %d %d\n", a, --a, a); 的寫法是
> > 有 bug 的程式,應該要避免
> 所以也是說,當 "," 運算元是不保證由前往後 ( 左 -> 右 ) 的方式計算囉?
ANSI-C規定","運算由左至右,
這裡並不是","運算, 而是函數參數的計算順序,
大部分compiler將函數參數堆入stack順序是由右至左,
但是ANSI-C沒規定, 而且這裡還牽涉到optimization的問題,
所以結果沒辦法由C語言標準推導出來
--
* Origin: ★ 交通大學資訊科學系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

melody

unread,
Nov 9, 2001, 9:37:01 PM11/9/01
to
有點複雜 .... ???? 有否參考資料適合我這初學者?

"伸羅" <sano...@bbs.cis.nctu.edu.tw> 撰寫於郵件
news:3jIHgM$6...@bbs.cis.nctu.edu.tw...

0 new messages