タグ付けされた質問 「short-circuiting」

特に複合条件をテストするときに、結果に影響を与えない実行時に特定のコードをスキップする一部の言語の機能





14
SQL WHERE句の短絡は評価されますか?
SQL WHERE句のブール式は短絡評価され ますか? 例えば: SELECT * FROM Table t WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key) 場合@keyがNULL IS TRUEと評価、さ@keyがNULLでなく、@key = t.Key評価済み? いいえの場合、なぜですか? はいの場合、保証されますか?ANSI SQLの一部ですか、それともデータベース固有ですか? データベース固有の場合、SqlServer?Oracle?MySQL?

7
短絡論理演算子は必須ですか?そして評価順は?
ANSI規格では、CまたはC ++のいずれかで、論理演算子を短絡させることを義務付けていますか? あなたのコードは短絡されているこれらの演算に依存すべきではないと言っているK&Rの本を思い​​出して混乱しています。誰かが標準のどこで論理演算が常に短絡されていると言われているのか指摘してもらえますか?私は主にC ++に興味がありますが、Cの回答も素晴らしいでしょう。 私はまた、評価順序が厳密に定義されていないことを読んだことを思い出します(どこで思い出せないか)。したがって、コードは依存しないか、式内の関数が特定の順序で実行されると想定しないでください。呼び出されますが、コンパイラーは最も効率的な順序を自由に選択できます。 標準はこの式の評価順序を示していますか? if( functionA() && functionB() && functionC() ) cout<<"Hello world";

9
&&と||をオーバーロードする理由は実際にありますか?短絡しませんか?
短絡演算子の振る舞い&&とは、||プログラマのための素晴らしいツールです。 しかし、なぜオーバーロードするとこの動作が失われるのですか?演算子は関数の単なる構文糖であると理解していますが、演算子にboolはこのような振る舞いがあります。なぜこの単一の型に制限する必要があるのですか?この背後に技術的な理由はありますか?

2
Javaの3項演算子はJava 7以降、1つの式しか評価しません-Java 1.6以下ではそれと違いましたか
Oracle Certified Associate Java SE 8 Programmer 1試験に備えて、公式の学習ガイドの3項式に関する次の段落に出くわしました。 三項式の評価 Java 7では、三項演算子の右側の式の1つだけが実行時に評価されます。短絡演算子と同様に、3項演算子の2つの右辺式の1つが副作用を実行する場合、実行時に適用されない可能性があります。この原則を次の例で説明しましょう:[...] 次の例で示すように、2つの式のうちの1つだけが評価されることを示しています。 int y = 1; int z = 1; int a = y < 10 ? y++ : z++; ここでは、yインクリメントのみzですが、そうではありません。 私がつまづいているのは、「Java 7以降...」と書かれている段落(黄色でマークされている)の始まりです。同じコードをJava 1.6でテストしましたが、動作の違いを見つけることができません。私は、Java 1.6が両方の式を段落で与えられた情報からのみ評価することを期待していました。誰かが「Java 7の時点で...」で何を言いたかったのか考えがありますか? 編集:混乱を避けるために:それは質問に要約されます、「Java 7の時点で」と書いているため、Java 6からJava 7に切り替えるときに、3項演算子に関して変更されたものはありましたか?



10
ifステートメント-短絡評価と読みやすさ
場合によっては、ifステートメントがかなり複雑になったり長くなったりする可能性があるため、読みやすくするために、の前に複雑な呼び出しを抽出することをお勧めしifます。 例えばこれ: if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall()) { // do stuff } これに bool b1 = SomeComplicatedFunctionCall(); bool b2 = OtherComplicatedFunctionCall(); if (b1 || b2) { //do stuff } (提供された例はないことを複数の引数などで他の呼び出しを想像し...、それだけで説明のために悪いです) しかし、この抽出により、短絡評価(SCE)が失われました。 毎回本当にSCEを失うのですか?コンパイラーが「最適化」してもSCEを提供できるシナリオはありますか? SCEを失うことなく2番目のスニペットの読みやすさを向上させる方法はありますか?

3
オペレーターを短絡させてください|| および&&はnull許容ブール値に存在しますか?RuntimeBinderは時々そう考えます
条件付き論理演算子 ||と&&、短絡論理演算子としても知られるC#言語仕様を読みました。私には、これらがnull許容ブール値、つまりオペランド型Nullable<bool>(これも記述されているbool?)に存在するかどうかが不明であるように思われたので、非動的型付けで試してみました。 bool a = true; bool? b = null; bool? xxxx = b || a; // compile-time error, || can't be applied to these types これで問題は解決したようです(仕様を明確に理解できませんでしたが、Visual C#コンパイラの実装が正しいと仮定すると、今ではわかりました)。 しかし、私dynamicもバインディングを試してみたかったのです。だから私は代わりにこれを試しました: static class Program { static dynamic A { get { Console.WriteLine("'A' evaluated"); return true; } } static dynamic B { get …

12
Javaに条件演算子と条件演算子の複合代入バージョンがないのはなぜですか?(&& =、|| =)
だから、ブール型の二項演算子のために、Javaがあり&、|、^、&&と||。 ここで彼らが何をしているのかを簡単に要約しましょう: JLS 15.22.2ブール論理演算子&、^、および| JLS15.23条件付き-および演算子&& JLS15.24条件付きまたは演算子|| の場合&、結果値は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で、はのタイプですがE1、E1評価されるのは1回だけです。 証拠として、次のスニペットは、NullPointerExceptionではなく、をスローしArrayIndexOutOfBoundsExceptionます。 int[] a = null; int[] b = {}; a[0] += b[-1];

6
このバージョンのCの論理ANDが短絡動作を示さないのはなぜですか?
はい、これは宿題の質問ですが、私はこのトピックについて調査とかなりの深い考えを行ったので、これを理解することはできません。この質問は、このコードが短絡動作を示さないことを示し、その理由を尋ねます。しかし、私には短絡動作を示しているように見えますが、なぜそうでないのか誰かが説明できますか? Cの場合: int sc_and(int a, int b) { return a ? b : 0; } それaが間違っている場合、プログラムはまったく評価しようとしないように見えbますが、私は間違っているに違いありません。bこの場合、プログラムが触れる必要がないのに、なぜプログラムが触れるのでしょうか。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.