問題タブ [short-circuiting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
12709 参照

sql - SQL の VB AndAlso と同等ですか?

SQL (SQL Server 2005) でVB のAndAlso/OrElseおよび C#の&&/に相当するものはありますか。||次のような選択クエリを実行しています。

たとえば、"@a" パラメータが NULL として渡された場合、WHERE 句の 2 番目の部分 (a = @a) を評価しても意味がありません。特別な構文を使用するか、クエリを書き直すことで、これを回避する方法はありますか?

ありがとう、ジェームズ。

0 投票する
9 に答える
3588 参照

coding-style - 短絡コードを使用する理由

関連する質問:短絡評価を使用する利点、言語が短絡評価を使用しないのはなぜですか? 、誰かがこのコード行を説明できますか? (論理演算子と代入演算子)

短絡コードを使用する言語の利点について質問がありますが、プログラマーにとっての利点は何ですか? コードをもう少し簡潔にすることができるというだけですか? それともパフォーマンス上の理由がありますか?

とにかく 2 つのエンティティを評価する必要がある状況については質問していません。たとえば、次のようになります。

私には、そこにある理由は明らかです。両方が真である必要があるため、ユーザーがデータを保存できない場合は、よりコストのかかるモデル検証をスキップできます。

これには(私にとって)明らかな目的もあります。

strlen()文字列以外の値で呼び出すのは賢明ではないためです。

私が疑問に思っているのは、他のステートメントに影響を与えない場合の短絡コードの使用です。たとえば、Zend アプリケーションのデフォルトのインデックス ページから:

これは次の可能性があります。

または、単一のステートメントとしても:

では、なぜ短絡コードを使用するのでしょうか。制御構造の代わりに論理演算子を使用するという「かっこよさ」のためだけに?ネストされた if ステートメントを統合するには? 速いから?

0 投票する
2 に答える
1824 参照

sql-server - 'OR'を使用するSQLSERVER式のすべての部分が評価されますか?

与えられた:

@Idがnullの場合:式はtrueと評価されます。2番目の部分@Id=Table.Idは引き続き考慮されますか?または、最初の部分が真であるとすると、式がtrueと評価されるだけで十分です(これはc#の場合です)。

これは、すべての部分が評価されているかどうかを知ることが重要な、はるかに複雑なORステートメントのために関連しています。


アップデート:

それ以来、この構文が良い代替手段であることがわかりました

0 投票する
8 に答える
14119 参照

c++ - ブール値の C++ 短絡

私は c++ が初めてで、コンパイラがブール値の遅延評価を処理する方法に興味があります。例えば、

A が 1 の場合、B==2 の部分は評価されますか?

0 投票する
7 に答える
10404 参照

java - Java短絡評価

Javaには短絡評価があると思いましたが、この行はまだヌルポインター例外をスローしています:

この場合perfectAgentnullであるため、式全体が を返すようにしたいのですfalseが、この行で NullPointerException が発生してアプリがまだクラッシュしています。

編集、一般的な応答:

perfectAgentisであるため、式が true になることはあり得ないため、 の右側にあるものは実行されませんnull。さらに言えば、有効な参照が含まれていないため (null ですべて)、実行&&することはできません。別のステートメントでnullをチェックする必要がないように、短絡評価を使用しようとしています。これにより、ロジックがより雑になります。perfectAgent.getAddress()perfectAgent

編集2(または、私はばかです):ええ、人生の多くのことと同様に、自分がバカだと世界に発表した直後に答えを見つけます. この場合、何か他のことをしているときに Eclipse の自動ビルドをオフにし、オンに戻さなかったので、ソースと一致しないクラス ファイルをデバッグしていました。

0 投票する
3 に答える
407 参照

c# - メソッド呼び出しで自分自身の短絡を強制できますか?

一連のオブジェクトをチェックして、どれも null でないことを確認したいとします。

可変数の引数を受け入れ、この種のチェックを簡素化するヘルパー関数を作成することは魅力的な見通しです。

次に、上記のコードは次のようになります。

右?違う。objが null の場合、NullReferenceExceptionに渡そうとするとobj.Parametersが取得されNoNullsます。

したがって、上記のアプローチは明らかに見当違いです。しかし、演算子ifを使用したステートメント&&は短絡されているため、問題なく機能します。だから:メソッド内で明示的に参照されるまでその引数が評価されないように、メソッドを短絡させる方法はありますか?

0 投票する
4 に答える
6263 参照

objective-c - Objective-C は短絡評価を使用しますか?

私は次の行に沿って何かを試しました:

そして得た:

-[NSNull 長さ]: 認識されないセレクターがインスタンスに送信されました

最初の条件が失敗した後、Objective-C は短絡しませんか?

0 投票する
6 に答える
3468 参照

sql-server - SQL クエリ実行のショートカットまたはロジック?

私は3つのテーブルを持っています:

SmallTableには、せいぜい数十件のレコードしかありません。BigTable数百万あり、実際には、このデータベースのテーブルを同じサーバー上の別のデータベースのテーブルと UNIONS するビューです。

結合ロジックは次のとおりです。

平均結合サイズは数千の結果です。表示されるものはすべて索引付けされています。

ほとんどのSmallTableレコードでは、flag1flag2が に設定されて1いるため、BigTable.text1 のインデックスにアクセスする必要さえありませんが、SQL Server はアクセスするため、コストのかかるインデックス スキャンとネスト ループが発生します。

との両方が に設定されている場合flag1、を気にする必要がないことを SQL Server に示唆するより良い方法はありますか?flag21text1

実際、これらの場合に BigTable への結合を完全に回避できれば (JoinTable は管理されているため、問題は発生しません)、このキー クエリはさらに高速になります。

0 投票する
11 に答える
17448 参照

java - Javaに条件付き演算子と条件付き演算子の複合代入バージョンがないのはなぜですか?(&& =、|| =)

したがって、ブール値の二項演算子の場合、Javaには、、、、および&があります。|^&&||

ここで彼らが何をしているのかを簡単に要約しましょう:

の場合&、結果の値はtrue、両方のオペランド値がtrue;の場合です。それ以外の場合、結果はfalseです。

の場合|、結果の値はfalse、両方のオペランド値がfalse;の場合です。それ以外の場合、結果はtrueです。

の場合^、結果の値はtrue、オペランド値が異なる場合です。それ以外の場合、結果はfalseです。

&&演算子は似&ていますが、左側のオペランドの値が。の場合にのみ右側のオペランドを評価しますtrue

||演算子はに似|ていますが、左側のオペランドの値が。の場合にのみ右側のオペランドを評価しますfalse

現在、5つすべてのうち、3つには複合代入バージョン、つまり、、|=およびが&=あり^=ます。だから私の質問は明白です:なぜJavaは同様に提供&&=しないのですか?||=必要以上に必要だと思い&=ます|=

そして、Javaにはがありますので、「長すぎるため」は良い答えではないと思います>>>=。この省略にはもっと良い理由があるに違いありません。


15.26代入演算子から:

12個の代入演算子があります。[...]= *= /= %= += -= <<= >>= >>>= &= ^= |=


&&=||=が実装された場合、最初に右側を評価しないのはそれだけであるというコメントがありました。複合代入演算子が最初に右側を評価するというこの概念は誤りだと思います。

15.26.2複合代入演算子から:

フォームの複合代入式は、E1 op= E2と同等ですE1 = (T)((E1) op (E2))。ここTで、はのタイプですが、 1回だけ評価されるE1点が異なります。E1

NullPointerException証拠として、次のスニペットは、ではなく、をスローしArrayIndexOutOfBoundsExceptionます。