最も単純な演算子であるプラス記号 (+) から始めましょう。プラス記号 (+) は二項演算子です。つまり、プラス記号は 2 つの数値を接続するだけであり、3 つ目以降の数値を接続することはありません。
したがって、「1 プラス 2 プラス 3」はコンピュータでは次のように表現されます。
(1 + 2) + 3 // または
1 + (2 + 3) // b通常は 1 + 2 + 3 と書きますが、数学における 1+2+3 と同等であるという意味ではありません。
では、数学の 1+2+3 は a を表すのでしょうか、それとも b を表すのでしょうか?
コンピュータの評価が左結合の場合、この式は最初のタイプ a と同等であり、右結合の場合、この式は 2 番目のタイプ b と同等です。
1 + 2 + 3 を簡単に理解すると、「1、2、3 を足す」ということになります。実際、私たちが扱う数学では、3 つの数字を足すことになります。 しかし、プログラミング言語ではそれだけではありません。
前に述べたように、+ 記号は 3 つ以上の数字を操作することはできず、2 つの数字の加算操作にのみ参加できます。
ちなみに、プラスとマイナスは単項演算子ですが、二項演算子の加算や減算と同じ記号を使用しますが、異なるものであるため、実際には +4 が 0+4 と同等であると考えないでください。それらは等価ではなく、
+4 は整数ですが、0+4 は加算式であり、正確に +4 と評価されます。
Java では a = +4 と短く書くことができますが、a = 0 + 4 と短く書くと警告が生成されます。
もう一つ、これも短い例がありますが、
短い b = 1;
short b = b + 4; // 警告
short b += 4; // 警告はありません。では、1 + 2 + 3 はどのように機能するのでしょうか。 ノイマン型アーキテクチャのプログラミング言語には副作用があり、私はそれを「コンピュータの計算プロセスがプログラマの脳の思考プロセスと異なる場合、それを副作用と呼ぶ」ことに慣れています(とはいえ、は本にはこのようには書かれていません)はい、しかし私はいつもそう思っていました)、最初はこうなるだろうと思っていましたが、コンピューターはこれを行わないことが判明しました、私はこれを副作用と呼んでいます。
以前の「ステートメントと式」を読んでいれば、これは次のように理解できます。
1 + 2 は戻り値が 3 になる式です。 この式の戻り値は別の式 3 + 3 に加算され、最終結果は 6 になります。
このコードをステートメントを使用して書き換えます。
// 1 + 2 + 3 を計算します
var a = 1 + 2;
var b = a + 3;この式を Lisp で評価すると、副作用はありません。
(+ (+ 1 2) 3) まだ理解できない場合、またはこの例が特殊すぎる場合は、別の例に変更しましょう。
5 > 4 > 3 数学では、この方程式は true と評価されます。このコードを C 言語で書くと、確かに false が返されます。
理由は上記と同じで、大なり記号 (>) は 3 つの数値を直接比較できません。true と 3 を比較すると、true は 1 に変換されます。これは 1 > 3 であるため、最終結果は当然 false になります。
つまり、「ステートメントと式」の記事の視点に戻ります。つまり、プログラミング言語のすべての式には値があります。
プログラミング言語の演算子は数学の演算子と同じですが、同等ではありません。 プログラムを書くときは、人が読めるように書きます。プログラムをデバッグするときは、コードの意味をコンピューターのやり方で考えることを学ばなければなりません。
たとえば、2 + 5 は実際には add(2, 5) または 2.add(5) であると理解することに慣れています。 「実際、多くの言語でこれが行われています」とこっそり教えてあげましょうか。