よく見かける演算子の優先順位表の解釈についてです。
例えば次の3つです
後置の++、ーー
前置の++、ーー
比較の<など
表によると高いほうから順に、後置、前置、比較となっています。
例えば、次の場合
if文には演算子が3つあります。
表にしたがって優先順位の高いほうから計算していくと
1.b から1を引く ⇒ b の値は 6
2.a に1を加える ⇒ a の値は 6
3.a と b を比較する ⇒ (6 < 6) ⇒ 結果は偽となる
と私は解釈できると思いました。
この解釈が正しいとなると上の if文を含め次のものは全て同じ結果ということになります。
if(++a < --b)
if(a++ < b--)
if(a++ < --b)
しかし実際は違います。
私もそうなると思っているわけではありません。
何パターンかのテストもしました。
結果は(上の解釈と違うものも含め)すべて期待通りでした。
しかし、表だけを見ると上の解釈は間違ってないように思えます。
どう読み解いたらいいのでしょうか。
もうひとつ。
+とー 、また*と/、それから<と>や<=や>=は優先順位が同じとなっております。
「そりゃそうでしょう」とは思いますが、
後置が前置より上であったり、==と!=が上の<などより下である理由がわかりません。
そうしないと困ることがあるのでしょうか。
以上を具体的な例を挙げて説明してもらえると助かります。
演算子の優先順位について
Re: 演算子の優先順位について
とりあえず答えやすいところだけ。
比較するのはaとbではなく、++aの結果とb--の結果です。
++aは前置インクリメントなので、インクリメントした後の値、すなわち6になります。
b--は後置デクリメントなので、デクリメントする前の値、すなわち7になります。
(6 < 7)は6より7の方が大きいので1になり、これは0と等しいとみなせないので真です。
さらに、「演算子の優先順位」は式をASTにした時にどの演算子がより葉に近い所になる(→先に評価される)かにかかわってきますが、&&などの一部の演算子を除いてある演算子の複数のオペランドのうちどれが先に評価されるかは指定されていません。
したがって、
さらに、例えば のような式だと、*は+より優先順位が高いですが、
a*bとa+bのどっちが先に評価されるかは不定となります。
優先順位だけでなく、演算子の意味も考えなければいけません。cuser さんが書きました:しかし、表だけを見ると上の解釈は間違ってないように思えます。
どう読み解いたらいいのでしょうか。
これは間違いです。cuser さんが書きました:3.a と b を比較する ⇒ (6 < 6) ⇒ 結果は偽となる
比較するのはaとbではなく、++aの結果とb--の結果です。
++aは前置インクリメントなので、インクリメントした後の値、すなわち6になります。
b--は後置デクリメントなので、デクリメントする前の値、すなわち7になります。
(6 < 7)は6より7の方が大きいので1になり、これは0と等しいとみなせないので真です。
さらに、「演算子の優先順位」は式をASTにした時にどの演算子がより葉に近い所になる(→先に評価される)かにかかわってきますが、&&などの一部の演算子を除いてある演算子の複数のオペランドのうちどれが先に評価されるかは指定されていません。
したがって、
の評価の順番は逆かもしれません。cuser さんが書きました:1.b から1を引く ⇒ b の値は 6
2.a に1を加える ⇒ a の値は 6
さらに、例えば のような式だと、*は+より優先順位が高いですが、
a*bとa+bのどっちが先に評価されるかは不定となります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 演算子の優先順位について
私が思っていた漠然とした疑問に対して、私の出した例より次の例のほうが断然適切だと思いました。
これによって漠然さがなくなり真の疑問が何なのかわかりました。
これは、(a * b) と (a + b) を比較する以外の解釈はないはずですが、その際、乗算が先か加算が先か不定だったんですね。
では、演算子の優先順位って何なのかという疑問が残ります。
(a * b < a + b) では、3つある演算子のうち2つは優先順位に関わらず順序が不定で
(a * b + c * d) では、演算子は同じく3つなのに優先順位の通り乗算が先で加算がその次ということです。
優先順位以外の何か別の要素がありそうですが、それが AST ということでしょうか。
初めて聞く言葉です。今までそれに関する知識が全くない状態でネットでチョロっと調べただけでは難しすぎました。
コンパイラーを作るための仕組みのような印象を持ちました。コンパイラーを作るなど私には想像もできません。
もう少し簡単な説明はないでしょうか。
これによって漠然さがなくなり真の疑問が何なのかわかりました。
訊きたかったのは正にこういうことだと思いました。
これは、(a * b) と (a + b) を比較する以外の解釈はないはずですが、その際、乗算が先か加算が先か不定だったんですね。
では、演算子の優先順位って何なのかという疑問が残ります。
(a * b < a + b) では、3つある演算子のうち2つは優先順位に関わらず順序が不定で
(a * b + c * d) では、演算子は同じく3つなのに優先順位の通り乗算が先で加算がその次ということです。
優先順位以外の何か別の要素がありそうですが、それが AST ということでしょうか。
初めて聞く言葉です。今までそれに関する知識が全くない状態でネットでチョロっと調べただけでは難しすぎました。
コンパイラーを作るための仕組みのような印象を持ちました。コンパイラーを作るなど私には想像もできません。
もう少し簡単な説明はないでしょうか。