ページ 11

++ -- 演算子についての質問。

Posted: 2007年4月15日(日) 14:19
by 大工
http://www.kouno.jp/home/c_faq/c3.html#0

のサイトにある

>i++は副作用をもたらす。つまりiの値を変更する。式の他のところで iが参照されているので、このことが未定義の振舞いを引き起こす (K&Rの言い回しではこの式の振る舞いは不定であると取れるが、C規 格は一段と厳しく未定義であるとしている。-- 質問11.33を参照のこ と)。


>後置増分演算子++も後置減分演算子--も元の値を返した後で、その演 算を行う。この"後"の意味付けがしばしば誤解を招く。前回値を産み 出したすぐ後で、かつ式のその他の部分が評価される前に、++や--が 増分や減分を行うことは保証されていない。単に式が"終了"する前 (ANSI Cの用語でいえば次の"副作用完了点"(sequence point)の前。 質問3.8を参照)のどこかで更新が実行されることが保証されているだ けである。上の例では、前回値と前回値を掛け合わせてから両方の増 分を実行することをコンパイラは選んだ。

副作用があいまいな部分が複数あるコードのふるまいは、常に未定義 である。(大まかに言うと、「副作用があいまいな部分が複数ある」 とは、++, --, =, +=, -=, etc. の組み合わせのいずれかが1つの式 の中に洗われ、同じオブジェクトが2回変更されたり、変更されてか ら値を調べられることを意味している。これは荒っぽい定義である。 正確な定義は質問3.8を参照のこと。"未定義"の意味については質問 11.33を参照のこと)自分の使っているコンパイラがそのような副作用 を持つコードをどう実装しているか調べるようなこともしてはいけな い(多くのCの教科書に載っている愚かな練習問題であるが、お薦めは しない)。K&Rが指摘しているように「もし様々なマシンでどうやって やって実行してるのか、わからなければ、わからないということが助 けとなるかもしれない。」

という説明があり前回置について解説してください><;
あと、副作用になる理由がいまいちわかりません・・・。。

Re:++ -- 演算子についての質問。

Posted: 2007年4月15日(日) 14:45
by Justy
という説明があり前回置について解説してください><;
あと、副作用になる理由がいまいちわかりません・・・。。

 i++における 前回値とは ++する前の値のことです。

 i=5 で、i++ なら前回値は 5になります。


 ここでいう副作用とはコンパイラに依って、同じ処理になることを
保証できない状態を言います。

 このサイトの例
[color=#d0d0ff" face="monospace]	int i = 7;
	printf("%d\n", i++ * i++);[/color]
 で考えてみます。
 これを擬似的なコードで書いてみると
[color=#d0d0ff" face="monospace]	printf("%d\n", i * i);		// 7 x 7 = 49
	++i, ++i;[/color]
 このように処理するものもあれば、
[color=#d0d0ff" face="monospace]	int i1 = i;
	i++;
	int i2 = i;
	i++;
	printf("%d\n", i1 * i2);		// 7 * 8 = 56[/color]
 結局、値を ++するタイミングはその式が終わるまでのどこか、とかしか
決まっていないので、++しつつ、その値を同じ式の別の場所で参照するような
ことがあると、いつ ++したのか次第で問題が起こる、というわけです。

Re:++ -- 演算子についての質問。

Posted: 2007年4月15日(日) 16:28
by 大工
なるほど!

ありがとうございます