LoginSignup
1
1

More than 5 years have passed since last update.

演算子の優先順位と結合性

Posted at

関連する記事

https://qiita.com/e16tsu/items/7ecabd7a06f0e9f4aadb
結合性の説明

この記事の目標

http://www.bohyoh.com/CandCPP/C/operator.html
この表の一番左の列に優先順位というのがありますが、この意味を説明することです。

「掛け算は足し算より先に計算する」

小学校では「掛け算は足し算より先に計算する」と習います。
例えば
1+2×3
の値は
1+(2×3)と同じで7ということですね。
上のURLの表でも*は+よりも優先順位の値が小さく、これは*は+よりも先に計算するということを表しています。
上の表では*の使い方が掛け算だけでなくポインタ絡みのやつ(単項演算子)もありややこしいのですが…

プログラミングだと演算の記号がいくつも出てくる

算数では掛け算と足し算の順番だけ知っていれば良かったのですが、プログラミングとなると掛け算と足し算以外にいくつも小学校で習っていない記号がいくつも出てきてしかも計算する順序も小学校で習っていない。
例えば || (OR)とか && (AND)とか

C言語では||とか&&の論理演算を整数に対してもできる

Javaでは 2 || 0などと書くと整数に対して論理演算はできませんとはねられますが、C言語ではprintf("%d",2||0);と書いてもはねられることはなく、2||3の値 1 が表示されます。C言語では0はfalse扱い、0以外の数字をtrueとして扱うこととなっており上の例では
2(true扱い) || 0 (false扱い) で true OR falseとなり、この値が1(true扱い)になっています。値がなぜ1なのか、0以外のtrue扱いの数ならなんでもいいのではという疑問はありますが、C言語の仕様で1になるようになっています。
話がC言語に脱線していますが結局、C言語では整数に対してできる演算が* + || && => %などと何種類もあり優先順位も違う。

例 

例 3 => 0 && 5 => 2

&&と=>どっちが先か確認します。
&&よりも=>が先なので
(3 => 0) && (5 => 2)
と同じ値です。

もし&&が=>よりも先だったら

3 => 0 && 5 => 2は
3 => (0 && 5) => 2 と同じになって =>は左結合なので
(3 => (0 && 5)) => 2  、(0 && 5)の値は0(false)で
(3 => 0) => 2   、(3 => 0)の値は1(true)
1 => 2 、この値は0(false)ってなります。

例 4+6*0/2

とりあえず+の計算はあとなので
4+(6*0/2)
*と/の優先順位を確認すると* 、/同じ優先順位となっています。
* / は左結合なので
6*0/2は 
(6*0)/2
左側を先に計算します
同じ優先順位だったら同じ結合性(左結合か右結合か)のはずです。違ってたらどう計算するんだってなると思います。

優先順が何段もある式の見方

優先順が先の演算子からかっこをつけていく見方と、逆に優先順が後の演算子からかっこをつけていく見方があります。
3*3 => 0 && 5*2 => 2 なら
(3*3) => 0 && (5*2) => 2
((3*3) => 0) && ((5*2) => 2)です。
逆に優先順位の一番低いやつで式が区切られていると思ってかっこを足していくと
3*3 => 0 && 5*2 => 2
(3*3 => 0) && (5*2 => 2)
自分としては優先順位の一番低いやつで式が区切られていると思っていくとわかりやすいと思います。

まとめ

この記事はC言語の話になっている。
優先順を理解して余計なかっこをつけないようすると良い
(3 => 0) && (5 => 2)のかっこは余計で
3 => 0 && 5 => 2と書いても変わらない

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1