こんにちは､ ようこそ｡ さて､ 主要な演算子､ 基本的な演算子､ 奇妙な演算子についてすべて話をしましたが､
演算子の優先順位という小さな概念について話をしなければなりません｡
このため､ 基本的にはこれらの演算子の順序をどう評価するかということになります｡
つまり､ 演算子の優先順位は､ 項と式のグループ化を決定し､
式の評価方法を決定する｡
しかし､ この概念は言語の一部であり､
言語を理解するための一部であるため､ 理解する必要があります｡
つまり､ 2つの演算子がオペランドを共有する場合､ 優先順位が評価の順番を決定することになるのです｡
そして､ これは例を挙げて明らかにすることになる｡
そのため､ 例えば乗算演算子は加算演算子よりも優先順位が高くなります｡
演算子によっては､ 評価の順番が変わってきます｡ ですから､ 例えば7＋3×2というように､
いろいろな計算をする複合文があったとします｡
これは複数の結果があり､ 足し算と､
掛け算をやっていることになります｡
足し算が先か､ 掛け算が先か､ どちらを先にするかで結果が変わるので､
理解する必要があります｡
例えば､ このxは7に3×2を加えたもので､ それぞれのオペランドを評価するときの順序によって､
結果は13にも20にもなるわけです｡
そのため､ さまざまな操作の実行順序によって､ 大きな違いが生まれます｡
そして､ そのために優先順位を理解する必要があるのです｡
Cは､ 最初に何をすべきかを選択するための具体的なルールを提供します｡
この場合､ プラスの掛け算をすればいいのでしょうか｡ まあ､ cはこれからどうなるか教えてくれるよ｡
理想的には､ それらを括弧で囲むと､ 何をすべきかを指示することになり､ その決定をすることになります｡
でも､
それを括弧でくくらないと､ プログラミング言語が勝手に判断してしまうんです｡
つまりcでは､ 乗算の方が加算演算子よりも優先順位が高くなるわけです｡
それでどうなるかというと､ 結果は13になるわけです｡
ここで､ 7に3を足して10とし､ 2をかけると20になる､
ということもできます｡
あるいは､ 7＋3×2､ つまり7＋6で13となります｡
そうやって､ 異なる価値観を持つことができるんですね｡
それは曖昧ですね｡ プラスを先にやるか､ 掛け算を先にやるか｡
幸いなことに､ これも言語によって決められることです｡ しかし､ 2つの異なる結果があることはおわかりいただけると思います｡
7＋3×2または7＋3×2｡
そこに間があるのがわかりますか？
今､ cは後者を実行しようとしている｡ 乗算の方が優先順位が高いので､ 先に乗算をすることになります｡
つまり､ 3×2をやって6になり､ それを足して7になるわけです｡
つまり､ 星のアスタリスクは足し算よりも優先順位が高いので､
結果xは13になるのです｡
そして､ どの演算子が優先されるか､ 一つ一つの演算子にルールがあるわけです｡
前例があるんです｡
そして､ 掛け算と割り算は足し算と引き算よりも優先順位が高いのです｡
そのため､ 例えば最初に演奏されるのは彼らです｡
括弧をつけると､ このような優先順位や言語による判断を避けることができます｡
括弧は､ 常に最も高い優先順位の式をグループ化します｡
だから､
7＋3と言って括弧で囲むと､ 必ず足し算を先にやってくれるんです｡
2の3倍を括弧で囲むと､
掛け算をしてから括弧の外にあるものを足すことになります｡
だから､ 本当は括弧を使えばいいんです｡ 必ず括弧を使用する｡
そうしないと､ 言葉が勝手に決めてしまうからです｡ 次の表で紹介するように､ すべての優先順位を暗記しなければならないので､
大変です｡
さまざまな演算子があり､ それらの優先順位を知っておかなければなりません｡
そのため､ 非常に混乱することがあります｡
これは､ 暗黙的な変換を言語に任せるか､ キャスト演算子を使って明示的な変換を行うか､
同じような考え方ですが､ ここでは括弧を使うだけです｡
この表を見ると､ まず連想性について説明したいので､ 後ほど見てみたいと思います｡
2つの演算子の優先順位が同じ場合どうなるかというと､
連想性は優先順位と関係がある｡ じゃあ､ どうやって順番を決めるんだ｡
じゃあ､ 連想力を応用するんだ｡ そのため､ 演算子の優先順位が同じであれば､
いつでも追加のルールを適用することができます｡
連想性とは､ 基本的に左側から始めて右側に行くか､
右側から左側に行くか､ ということなんですね｡
つまり､ オペランドを共有し､ 両者が同じ順番で実行される場合､ 連想ルールに基づく文の順番で実行されることになるわけです｡
ですから､
ほとんどのオペレーターは､ 左から右の順番になります｡ そこで､ 一例をご紹介しましょう｡
1イコール2イコール3でないと言う場合､
イコールとノットイコール演算子感嘆符イコールは同じ優先順位を持つ｡
この場合､ 曖昧な部分があるわけです｡ 問題が発生しました｡
まず何を評価すればいいのかがわからない｡ 1イコール2なのか､ 2が3と等しくないのか､
ブール式をやっているのだから､
それが重要なのです｡
これはブーリアン式なので､ trueかfalseを返します｡
そこで､ ここで行うのは､ 連想性を利用することです｡
イコールとノットイコールの連想性はともに左から右である｡
まず1イコールイコール2ってやるんだろ､ それじゃ偽になるだろ｡
そして､ 3とは等しくないfalseと言い出すのです｡
つまり､
1は2に等しく､ そしてそれは3には等しくないということです｡
だから､ 結果は偽りになる｡ つまり､ 左側の式が先に実行され､
右側に移動していくわけです｡
つまり､ 基本的にはこの括弧と同じだと考えてください｡
まず､ 1が2に等しいと評価することになる｡
そして､ その評価がtrueかfalseであれば､ is that equal to 3と言うことになります｡
そして､ これは真偽の値を持たないので混乱する｡
しかし､ 1イコールイコールは､ 比較演算子であって､ 代入演算子ではないことを忘れないでください｡
しかも､ ここでは変数を使っていないので､ さらに混乱します｡
しかし､ これらの数値を変数に入れると､
「xはyに等しいから､ xが1､ yが2なら､ 2は偽と評価される」ということになりますね｡
どちらも平等ではないからです｡ そして､ 3が3に等しい別の変数zだった場合､
does x equals y is false,
z is equal to 3と言うことになるのです｡
だから､
falseは3とは等しくない｡ だから､ 虚偽になる｡
そこで､ 1イコールイコール2が先に実行され､ 結果は再び0偽となる｡
0と3が等しくない場合､ 1が真になるように実行されます｡
だから､ 最初は偽と言ったのですが､ 明らかに0は3には等しくないので､ 全体として偽と評価されることになります｡
全体がtrueと評価されてしまいますが､ 0は3とは等しくないので､ 申し訳ありません｡
つまり､ 0と3は等しくないから偽だと言っていたのですが､ 実際には真と評価されるということです｡
だから､ そこそこきれいなんです｡ さて､ ここにすべての優先順位と連想順位の規則を記した表がありますが､
これを暗記するのはとても大変です｡
そこでまた､ どうするかというと､ 括弧を使うのです｡
しかし､ ここに表がある｡ 優先順位が高いものが上になるので､
後置演算子は優先順位が最も高くなります｡
そして､ そのいずれかを同じ表現で使っている場合は､ 左から右に読みます｡
つまり､ 後置演算子､ 括弧のようなものが最も優先されるのです｡
だから､ 何か括弧を入れるたびにそれが効いてくる｡
でも､ 括弧があるし､ 後置演算子もある｡
ポインタの話はまだしていませんが､
ダッシュの大小はともかく､ プラスとマイナスは後置修飾で､ 最も高い優先順位を持っています｡
単項演算子とは､
プラスマイナス､ 感嘆符（not）､ チルダ（bitwise）､ プラスプラスマイナス､
キャスト演算子などのことで､ オペランドが1つしかないため単項演算子と呼ばれるのです｡
そして､ アスタリスク演算子がポインタ演算子です｡ アンパサンドはビット単位､ sizeofはビット単位｡
それらは､ 次に優先されます｡
しかし､ ここでは､ 同じ行のステートメントに2つある場合､
実際には右から左に読んで評価することになります｡
そしてまた､ 私たちはただ順番に行くだけです｡ この順番を知り､ 暗記しなければならない｡ そのため､ かなり難しいのですが､
表の一部を図解してお見せしたいと思います｡
オペレーターが多いですね｡
このように､ プレゼンスレベルには様々な種類があり､ 先ほども言ったように､ ほとんどの場合､
左から右へと連想されます｡
単項演算子には右左の連想性しかないんですね｡
つまり､ ビット演算子は下に向かって､ すべて左から右へと続くのです｡
条件付き三項演算子 右から左へ｡
アサインメントオペレーターは常に一番下にあります｡ それはいつも最後に評価されます｡
そして､ それらが同等であれば､ そこにある他のものを右から左に評価します｡
それから､ カンマは演算子とも呼ばれます｡ それは左から右へ｡
もう一つの概念は､ 優先順位と連想性ですが､
この他の例ではあまり取り上げません｡
結局は括弧を使いまくることになるわけで､
それはそれでいいんです｡
しかし､ もしあなたが言葉を完全に理解したいのなら､ これらの概念を理解したいのなら､ だからこそ私はそれをあなたに伝えるのです｡
このような細かいことを知らなければ､ 誰も自分が言語を知っているとは言えないのです｡
でも､ なるべく括弧を使うようにしましょう｡ ありがとうございます｡