タグ付けされた質問 「operators」

プログラミング言語に関して言えば、演算子は一般的に関数のように動作する構成ですが、構文的または意味的に通常の関数とは異なります。ウィキペディアから:http://en.wikipedia.org/wiki/Operator_%28programming%29

16
ユーザー定義の演算子が一般的ではないのはなぜですか?
関数型言語で見落としている機能の1つは、演算子が単なる関数であるという考えです。したがって、カスタム演算子を追加することは、関数を追加するのと同じくらい簡単です。多くの手続き言語では演算子のオーバーロードが許可されているため、ある意味では演算子は関数のままです(これは、テンプレートパラメーターの文字列として演算子が渡されるDで非常に当てはまります)。 演算子のオーバーロードが許可されている場合、カスタム演算子を追加するのは簡単なことが多いようです。私はこのブログ投稿を見つけました。これは、カスタム演算子が優先順位規則のために中置記法でうまく機能しないと主張していますが、著者はこの問題にいくつかの解決策を提供します。 私は周りを見回しましたが、その言語のカスタム演算子をサポートする手続き言語を見つけることができませんでした。ハック(C ++のマクロなど)がありますが、それは言語サポートとほとんど同じではありません。 この機能の実装は非常に簡単なので、なぜもっと一般的ではないのですか? itいコードにつながる可能性があることは理解していますが、それによって、過去に言語設計者が簡単に悪用される可能性のある便利な機能(マクロ、三項演算子、安全でないポインター)を追加することを妨げませんでした。 実際の使用例: 欠落している演算子を実装します(たとえば、Luaにはビット演算子がありません) Dの模倣~(配列連結) DSL |Unixパイプスタイルの構文シュガーとして使用(コルーチン/ジェネレーターを使用) 私はまた、言語に興味があるんカスタム演算子を許可するが、私は、より興味なぜそれが除外されています。スクリプト言語をフォークしてユーザー定義の演算子を追加することを考えましたが、どこにも表示されていないことに気付いたときに自分自身を止めました。したがって、言語デザイナーが私よりも賢いのは私がそれを許可していないことにはおそらく十分な理由があります。

7
短絡評価、それは悪い習慣ですか?
私がしばらく知っているが、考慮されていないことは、ほとんどの言語では、順序に基づいてifステートメントで演算子を優先することができるということです。私はよく、これをヌル参照例外を防ぐ方法として使用します。例えば: if (smartphone != null && smartphone.GetSignal() > 50) { // Do stuff } この場合、コードは最初にオブジェクトがnullでないことを確認し、次にこのオブジェクトが存在することを知って使用します。言語が賢いのは、最初のステートメントがfalseの場合、2番目のステートメントを評価しても意味がないため、null参照例外がスローされないことがわかっているためです。これはandand or演算子でも同じように機能します。 これは、インデックスが配列の境界内にあることを確認するなど、Java、C#、C ++、Python、Matlabなどのさまざまな言語でこのような手法を実行できるなど、他の状況でも役立ちます。 私の質問は次のとおりです。この種のコードは悪い習慣を表していますか?この悪い習慣は、隠れた技術的な問題から生じますか(つまり、最終的にエラーになる可能性があります)、または他のプログラマーにとって読みやすさの問題につながりますか?紛らわしいですか?

15
演算子のオーバーロードに対する引数を理解していません[非公開]
私は彼が言うジョエルの記事の一つを読んだ: 一般的に、私は物事を隠す言語機能が少し怖いことを認めなければなりません。コードが表示されたら i = j * 5; …Cでは、少なくとも、jに5が乗算され、結果がiに格納されていることがわかります。 しかし、C ++で同じコードスニペットを見ると、何もわかりません。なし。C ++で実際に何が起こっているのかを知る唯一の方法は、iとjの型を調べることです。これは、jがoperator*オーバーロードされた型であり、乗算しようとするとひどく機知に富んだ動作をするためです。 (エンファシス鉱山。)物事を隠す言語機能が怖い?どうしてそれが怖いの?物事を隠すこと(抽象化とも呼ばれます)は、オブジェクト指向プログラミングの重要なアイデアの1つではありませんか?methodを呼び出すたびにa.foo(b)、それが何をするのかまったくわかりません。あなたは他のどこかで宣言されるかもしれないタイプaとbは何かを見つけなければなりません。それでは、オブジェクト指向プログラミングはプログラマからあまりにも多くのことを隠してしまうので、オブジェクト指向プログラミングを廃止すべきでしょうか? そして、演算子のオーバーロードをサポートしていない言語で記述する必要があるかもしれないとはどうj * 5違いj.multiply(5)ますか?繰り返しになりますが、loとbeholdは、非常に機知に富んだ何かを行うメソッドを持つ型である可能性があるためj、multiplyメソッドの型とピークをメソッド内で調べる必要があります。jmultiply 「ムアハハ、私はメソッドmultiplyに名前を付ける邪悪なプログラマーですが、実際にそれが行うことは完全に曖昧で直感的ではなく、物事を増やすこととはまったく関係ありません。」それはプログラミング言語を設計するときに考慮しなければならないシナリオですか?次に、誤解を招く可能性があるという理由で、プログラミング言語の識別子を放棄する必要があります! メソッドが何をするのか知りたい場合は、ドキュメントを見るか、実装の内部を覗いてください。演算子のオーバーロードは単なる構文上のシュガーであり、それがゲームをどのように変えるかはわかりません。 教えてください

25
三項演算子は有害と考えられますか?[閉まっている]
たとえば、このワンライナーを好むだろうか int median(int a, int b, int c) { return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c) ? a : (b<c) ? c : b; } または複数のreturnステートメントを含むif / elseソリューションですか? ?:適切な場合と適切でない場合 初心者に教えたり隠したりするべきですか?

6
マイナス記号「-」が一般にプラス記号と同じように過負荷にならないのはなぜですか?
プラス記号+は、加算と文字列の連結に使用されますが、そのコンパニオンであるマイナス記号、は-、通常、文字列のトリミングや減算以外の場合には表示されません。その理由や制限は何でしょうか? JavaScriptの次の例を検討してください。 var a = "abcdefg"; var b = "efg"; a-b == NaN // but a+b == "abcdefgefg"

2
なぜビット演算子は比較よりも優先度が低いのですか?
理由を説明してもらえますか、なぜ最も一般的な言語の束(下記の注を参照)で比較演算子(==、!=、<、>、<=、> =)がビットごとの演算子(&、|、^ 、〜)? この優先順位が自然な使用法に出会ったことはないと思います。それは常に次のようなものです: if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied 私が使用する場合: flags = …


3
Pythonの**の名前は何ですか?
Pythonをプログラミングするとき**、変換を行うためにaを行うことがあります。私はそれが何をするのか理解していますが、どのデータ構造を操作していますか?A dictと他のものは何ですか?array?**オペレーターの名前はありますか?

7
「nor」のキーワードまたは演算子はありますか?
norに相当する演算子はありますか?たとえば、私の好きな色は緑でも青でもありません。 そして、コードは次と同等になります。 // example one if (color!="green" && color!="blue") { } // example two if (x nor y) { // x is false and y is false }
56 operators 

9
なぜ==演算子文字列値の比較がJavaにならないのですか?
有能なすべてのJavaプログラマーは、==が参照の等価性をチェックするため、==ではなくString.equals()を使用してストリングを比較する必要があることを知っています。 文字列を扱うとき、ほとんどの場合、参照の等価性ではなく値の等価性をチェックしています。==を使用するだけで文字列値を比較できる言語であれば、より直感的になると思います。 比較として、C#の==演算子は文字列 sの値が等しいかどうかをチェックします。参照の等価性を本当に確認する必要がある場合は、String.ReferenceEqualsを使用できます。 もう1つの重要な点は、文字列は不変であるため、この機能を許可しても害はありません。 これがJavaで実装されない特別な理由はありますか?

4
可変型の「演算子」を持つ言語がそれほど多くないのはなぜですか?
私はそれをこのように意味します: <?php $number1 = 5; // (Type 'Int') $operator1 = +; // (Type non-existent 'Operator') $number2 = 5; // (Type 'Int') $operator2 = *; // (Type non-existent 'Operator') $number3 = 8; // (Type 'Int') $test = $number1 $operator1 $number2 $operator2 $number3; //5 + 5 * 8. var_dump($test); ?> しかし、この方法でも: <?php …

7
ほとんどの主流言語が、3者間ブール比較の「x <y <z」構文をサポートしないのはなぜですか?
2つの数値(または他の適切に配列されたエンティティ)を比較したい場合は、で比較しx &lt; yます。それらのうち3つを比較したい場合は、高校の代数の生徒が試してみることをお勧めしx &lt; y &lt; zます。私のプログラマーは、「いいえ、それは無効です、あなたはしなければなりませんx &lt; y &amp;&amp; y &lt; z」と答えます。 私が出会ったほとんどの言語はこの構文をサポートしていないようです。これは数学でどれほど一般的であるかを考えると奇妙です。Pythonは注目に値する例外です。JavaScript は例外のように見えますが、実際には、演算子の優先順位と暗黙の変換の単なる残念な副産物です。node.jsでは、と1 &lt; 3 &lt; 2評価されtrueます(1 &lt; 3) &lt; 2 === true &lt; 2 === 1 &lt; 2。 だから、私の質問はこれです:なぜx &lt; y &lt; z期待されるセマンティクスで、プログラミング言語で一般的に利用できないのですか?

3
なぜC ++のブール型は++をサポートしているのに-ではないのですか?
なぜ演算子--はboolには存在しないのに、演算子には存在しないの++ですか? C ++で試しましたが、質問が他の言語に当てはまるかどうかわかりません。私も知りたいです。 私は知っている、私は++ブールで演算子を使用することができます。boolをtrueに等しくします。 bool b = false; b++; // Now b == true. --反対の方法で演算子を使用できないのはなぜですか? bool b = true; b--; // Now b == false; あまり便利ではありませんが、興味があります。

10
ほとんどのプログラミング言語に '!>'(より大きくない)および '!<'(より小さくない)演算子がない理由はありますか?
何か理由があるのか​​、それとも単なる歴史の偶然なのか、ほとんどのプログラミング言語には演算子!&gt;と!&lt;演算子がないのだろうか? a &gt;= b (大きいOR Bに等しい)のように書くことができた!(a &lt; b) (より少ないNOT b)に等しくなります、a !&lt; b。 この質問は、私が自分の式ツリービルダーをコーディングしている最中に思いつきました。ほとんどのプログラミング言語は持っていないa != bためにオペレータを!(a=b)、なぜ何!&gt;と!&lt;? 更新: !&lt;(ないより少ない)で発音しやすくより&gt;=(大きいまたは等しいです) !&lt;(ないより少ない)で入力するより短いより&gt;=(大きいまたは等しいです) !&lt;(以上ではない)理解するのが簡単です&gt;=(以上) * OR2つのオペランド(grater、equals)を操作するために必要なバイナリ演算子であるのに対しNOT、単項演算子であり、1つのオペランド(より小さい)でのみ操作する必要があるためです。

9
代入演算子に値を返すことの利点は何ですか?
JavascriptとPHPの両方を置き換える言語を開発しています。(これで問題が発生することはありません。これらの言語のいずれにも大規模なインストールベースがあるわけではありません。) 変更したいことの1つは、代入演算子を代入コマンドに変え、戻り値を使用する機能を削除することでした。 x=1; /* Assignment. */ if (x==1) {} /* Comparison. */ x==1; /* Error or warning, I've not decided yet. */ if (x=1) {} /* Error. */ これは、Cの人々が愛している1行関数が機能しなくなることを意味します。私の個人的な経験を超える証拠はほとんどありませんでしたが、これが起こったのはほとんどの場合、実際に比較操作を目的としたものでした。 またはそれは?代入演算子の戻り値の実用的な用途は、簡単に書き直すことができませんか?(このような概念を持つ言語の場合。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.