みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

インクリメント/デクリメント演算子を使った計算

Javaの質問に「インクリメント/デクリメント演算子を使った計算」というのがありました。

int a = 10;
int b = a++ + ++a + --a - a--;

普通、こんなことはしないのですが、試しにやってみました。
これは
int a = 10;
int b = a++;
b += ++a;
b += --a;
b -= a--;
と同値だと思うのですが、手元の環境で次の結果となりました。

  Java   bcc(C)   bcc(C++)  MinGW(g++) MinGW(gcc)
(1) 11 : 10  11 : 10  11 : 10   11 : 10    11 : 10
(2) 12 : 22  12 : 22  12 : 22   12 : 22    12 : 22
(3) 11 : 33  11 : 30  11 : 30   11 : 32    11 : 32
(4) 10 : 22  10 : 20  10 : 20   10 : 22    10 : 22

ここで、各結果は「a : b」の形で
(1) b = a++; (2) b = a++ + ++a; (3) b = a++ + ++a + --a;
(4) b = a++ + ++a + --a - a--;
を出力しています。

ただし、MinGW(gcc)のみoperation on `a' may be undefinedの警告が出ました。
どなたか、原因を教えていただけますか。

環境はWinXP Pro SP3, Java 1.6.0_14, bcc 5.5.1.2 gcc/g++ 3.4.5です。

投稿日時 - 2009-07-30 21:40:24

QNo.5168988

暇なときに回答ください

質問者が選んだベストアンサー

Javaの場合、式中のオペランドの評価順序は厳密に規定されていますが、C/C++では不定になります。さらに、C/C++の場合、副作用完了点の前に同じオブジェクトを複数回更新した場合の動作は未定義ですので、どんな結果になるか分かりません。

投稿日時 - 2009-07-30 21:59:22

お礼

jacta様、回答ありがとうございます。
先ほど、asuncion様にお礼を書きましたが、jacta様の回答を見落としてしまい、大変申し訳ありません。

納得いたしました。ありがとうございます。

投稿日時 - 2009-07-30 22:52:03

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>int b = a++ + ++a + --a - a--;

bを求める途中で「どの時点の」aの値を使うかは、言語規格上、未定義です。
その結果、bがどういう値になるかは処理系の設計内容に依存します。
処理系によって一部異なる結果が出たのは、致し方ないことです。

投稿日時 - 2009-07-30 22:07:04

お礼

asuncion様、早速の回答ありがとうございます。
言語規格とはANSIのことと思いますが、昔K&Rには前置と後置の説明があったような記憶が・・・
(バイブルがどこに隠れたか分からない)

実務ではありえない話ですが、お付き合いいただきありがとうございます。

投稿日時 - 2009-07-30 22:44:13

あなたにオススメの質問