単純に左から右に評価しないのはなぜですか? 優先順位がコードをより読みやすくする方法を誰かが説明できますか? 私には、より多くの考えとエラーの可能性がさらに必要なようです。アインシュタインは、「すべては可能な限りシンプルにすべきですが、それ以上にシンプルにするべきではありません」と言いました。彼はプログラマーではなかったと思います。
8 に答える
数学では、コンピューター言語が発明される前に、演算子の優先順位があったためです。
2 + 5 * 3 = 17 (and not 21)
*
演算子よりも演算子の優先順位が高くない言語は、+
混乱を招きます。
C++ からの別の例:
std::cout << 7 * 8 << std::endl;
*
演算子が演算子よりも優先されない場合<<
、これはコンパイルされません。
std::cout << 7
最初に評価さstd::cout
れ、結果として生成されます(出力される副作用7
があります)- 次に、誰かが整数を乗算するため
std::cout * 8
の本当に奇妙な演算子を定義しない限り、定義されていないものを評価したいと思うでしょう。*
outputstream
演算子の優先順位により、「常識の範囲内で」不必要な括弧を配置する必要がなくなります (ただし、実際の優先順位を認識していないためにバグが発生する場合があることに同意します)
ここで、あなたは疑問に思うかもしれません: なぜ数学に演算子の優先順位があるのですか? このウィキペディアの記事では、いくつかの歴史的事実とディスカッション フォーラムへのリンクについて言及しています。私にとって重要な議論は、多項式を書くときの議論です。
ax^2 + bx + c
演算子の優先順位がない場合、次のように記述する必要があります。
(a(x^2)) + (bx) + c
APLには演算子の優先順位がありません (括弧を除く)。コードは右から左に読み取ります (ヘブライ語やアラビア語のように)。とはいえ、APL はニッチな言語であり、これが理由の 1 つです。他のほとんどの言語は、他の回答がすでに指摘しているように、長年確立された算術の優先順位規則を模倣しています。括弧。
APLが示しているように、優先ルールを廃止することも、より正確には、そのようなルールを 1 つだけ持つこともできます。
「単純で一貫性のある再帰的な優先規則が 1 つだけあります。関数の右側の引数は、その関数の右側にある式全体の結果です。」
たとえば、「J」(APL バリアント) の場合:
1+2*3 => 7 Computed as 1+(2*3)
2*3+1 => 8 Computed as 2*(3+1)
APL (および J) には非常に多くの演算子があるため、それぞれの優先順位と結合規則を覚えておくのは困難です。
演算子の優先順位がある理由は、合計が2*4
WHOLE 数値のように表示されるためです。
2*4
したがって、存在しない方法で考えることができます。それは単に8
です。
したがって、基本的に行っているのは、次のように合計を「単純化」すること2+10*2
です2+20
。
次の合計のように: 2143+8^2+6^9
. あなたは書きたくない2143+262144+10077696
。(そして、もっと大きな式がある場合、これがどのように見えるか想像してみてください)
これは基本的に、合計の外観を単純化するためです。足し算と引き算はどちらも演算の最も基本的な形式です。だから優先順位があるのは、和の可読性を高めるためです。
そして、私が言ったように、+
and-
演算子は存在する最も基本的な演算子であるため、より「複雑な」演算子を最初に解決することは理にかなっています。
たとえば、演算子の優先順位を使用すると、次は14に評価されます。
2 + 3 * 4
それがなければ、予想外の20に評価されます。