演算子の優先順位について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cuser

演算子の優先順位について

#1

投稿記事 by cuser » 7年前

よく見かける演算子の優先順位表の解釈についてです。
例えば次の3つです
後置の++、ーー
前置の++、ーー
比較の<など
表によると高いほうから順に、後置、前置、比較となっています。
例えば、次の場合

コード:

a = 5;
b = 7;
if(++a < b--)
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)

しかし実際は違います。
私もそうなると思っているわけではありません。
何パターンかのテストもしました。
結果は(上の解釈と違うものも含め)すべて期待通りでした。
しかし、表だけを見ると上の解釈は間違ってないように思えます。
どう読み解いたらいいのでしょうか。

もうひとつ。
+とー 、また*と/、それから<と>や<=や>=は優先順位が同じとなっております。
「そりゃそうでしょう」とは思いますが、
後置が前置より上であったり、==と!=が上の<などより下である理由がわかりません。
そうしないと困ることがあるのでしょうか。

以上を具体的な例を挙げて説明してもらえると助かります。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 演算子の優先順位について

#2

投稿記事 by みけCAT » 7年前

とりあえず答えやすいところだけ。
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
のような式だと、*は+より優先順位が高いですが、
a*bとa+bのどっちが先に評価されるかは不定となります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cuser

Re: 演算子の優先順位について

#3

投稿記事 by cuser » 7年前

私が思っていた漠然とした疑問に対して、私の出した例より次の例のほうが断然適切だと思いました。
これによって漠然さがなくなり真の疑問が何なのかわかりました。
みけCAT さんが書きました:さらに、例えば

コード:

a*b < a+b
のような式だと、*は+より優先順位が高いですが、
a*bとa+bのどっちが先に評価されるかは不定となります。
訊きたかったのは正にこういうことだと思いました。
これは、(a * b) と (a + b) を比較する以外の解釈はないはずですが、その際、乗算が先か加算が先か不定だったんですね。
では、演算子の優先順位って何なのかという疑問が残ります。

(a * b < a + b) では、3つある演算子のうち2つは優先順位に関わらず順序が不定で
(a * b + c * d) では、演算子は同じく3つなのに優先順位の通り乗算が先で加算がその次ということです。

優先順位以外の何か別の要素がありそうですが、それが AST ということでしょうか。
初めて聞く言葉です。今までそれに関する知識が全くない状態でネットでチョロっと調べただけでは難しすぎました。
コンパイラーを作るための仕組みのような印象を持ちました。コンパイラーを作るなど私には想像もできません。

もう少し簡単な説明はないでしょうか。

たいちう
記事: 418
登録日時: 13年前

Re: 演算子の優先順位について

#4

投稿記事 by たいちう » 7年前

まず、「演算子の優先順位」という言葉を誤解しているのでしょう。
評価の順番はまた別の話です。

x = a * b + c;

が、

x = ((a * b) + c);

と解釈されるという意味です。
もし、加算の優先度が高い規則だったら、

x = (a * (b + c));

と解釈されてしまいます。


次に、前置インクリメントと後置インクリメントの違いを理解していないようです。
以下を試して理解してください。

コード:

a = 5;
x = ++a;

b = 7;
y = b--;

printf("%d, %d, %d, %d\n", a, b, x, y);

閉鎖

“C言語何でも質問掲示板” へ戻る