- 締切済み
演算子の優先順位
インクリメントと四則演算の優先順位に関して迷っています。 手持ちの教材では、++,--は四則演算+,-,*,/よりも上位なはずなのですが、どうやら後から計算されているようなのです。 【具体例】 g=10, h=5としたときに i = ++g / h-- とすると、i = 2となるのが、わかりません。 なぜでしょうか?
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
なるほどそういうわけでしたか > #8 おそらく間違いなくそうだろうな(as-if ルールのこと)だろうなとは思ったのですが、規格が見つけられなくて、「わかっている」という状況ではなかったのでありました。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
分かっているとは思われるが蛇足的に: as-if ルール (5.1.2.3) により, h のデクリメントはしなくてもいいです>#7. とはいえ, g をインクリメントするんだとしたらどことなく中途半端な香りが漂う. まあ, GCC で最適化かけると変数が全部なくなりますが.
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
さらについでをいえば、演算子の優先順序はあくまでも結合の優先順序であって、時間的に「先に計算される」というのも保証の限りではありません。 さらについでにいえば、 int main() { int g = 10; int h = 5; int i = ++g / h--; printf("i = %d", i); return 0; } というソースを C++Builder XE でコンパイルしてみたら、h をデクリメントするコードは生成されませんでした。 確かに(このあと h は使われないので)実害はないのですが、それで良いのか? とちょっとだけ思いました。
- Tacosan
- ベストアンサー率23% (3656/15482)
ついでにいうと 「++gは前置なのでまずこれが処理され、g=11となります。 h--は後置なので、一連の処理が終わった「後で」処理されます。」 も正確じゃないですけど>#5. g が 10 のときに ++g があったらそれは 11 と評価される. で, 次の副作用完了点までのどこかで g の値が 11 になる. 同じように, h = 5 のときに h-- は 5 と評価され, 次の副作用完了点までのある時点で h が値が 4 になる. ついでにいえば i = ++g/h-- を評価すると 2 になり, 次の副作用完了点までのどこかで i は 2 となる. 全て「次の副作用完了点までのどこか」でしかなく, 正確にいつかはわからない (しそれに依存してはいけないので知る必要もない) というのは頭に入れておかないとダメですよね.
- Wr5
- ベストアンサー率53% (2173/4061)
……おお、風邪でぼーっとしててミスした。 ># i = ++h + j + hh++;とか。 は # i = ++h + j + h++;とか。 です。 さて、 10 / 5が2というのは納得いくが、 11 / 5とか、11 / 4が2は変だろ!!! というとであれば…既に沢山ついている「型」について勉強し直しましょう。 # そういう意味で「例が悪い」と書いています。 # ++や--が先に実行されようが後に実行されようが、int型である限り2にしかなりませんから。 printf("10/5=%d\n" , 10 / 5); printf("11/5=%d\n" , 11 / 5); printf("11/4=%d\n" , 11 / 4); をお試しあれ。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
これがわからないという場合、自分は、どう解釈したので、こうなるはずなのに、実際はこうなった。 と、そういう情報をつけるといいかと思います。 g, h, i がすべて int だとすると、これは、正しい動作です。 i だけが int で他が double でも正しい動作です。 なので、「どういう解釈をしたので、自分の意見と合わない」という情報があれば良いかなとは思います。
- edomin7777
- ベストアンサー率40% (711/1750)
まさか、「iがintだから」なんていう事はないよね?
- Tacosan
- ベストアンサー率23% (3656/15482)
ご心配なく. ちゃんと ++ や -- の方が優先されているはずですよ. g や h の型は?
- Wr5
- ベストアンサー率53% (2173/4061)
「前置」と「後置」で動作が違うのですが、そのあたりは理解されています? そして…例が悪いですねぇ……。 >g=10, h=5としたときに >i = ++g / h-- ++gは前置なのでまずこれが処理され、g=11となります。 h--は後置なので、一連の処理が終わった「後で」処理されます。 i = 11 / 5 が実行されてi=2になります。(int型であれば端数は切り捨てられます) その後で、後置になっているh--が実行されh=4となります。 なにか問題でも? # 型が不明ですので、全てint型前提になっていますが… iがfloatやdoubleでもgとhがintなら結果として端数は切り捨てられます。(どっちかキャストしましょう) ちなみに、1つの式の中で同じ変数に対するインクリメント/デクリメントが複数回出てきた場合の動作は未定義となっていたハズですのでご注意を。 # i = ++h + j + hh++;とか。