6

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

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

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

if($user->auth() AND $model->valid()){
  $model->save();
}

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

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

if(is_string($userid) AND strlen($userid) > 10){
  //do something
};

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

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

defined('APPLICATION_PATH')
 || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

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

if(!defined('APPLICATION_PATH')){
  define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}

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

if(!defined('APPLICATION_PATH'))
  define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

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

4

9 に答える 9

4

プログラマーにとって、他のより冗長な構文よりも冗長性の低い構文の利点は次のとおりです。

  • 入力が少ないため、コーディング効率が高くなります
  • 読みにくくなるため、保守性が向上します。

今、私が話しているのは、あまり冗長でない構文が、まったく同じように認識されている方法で、トリッキーでも巧妙でもないが、文字数が少ない場合だけです。

ある言語で特定の構成を目にしたときに、使用する言語で使用できるようにしたいことがよくありますが、以前は必ずしもそれを実現していませんでした。私の頭のてっぺんからいくつかの例:

  • 関数へのポインタを渡す代わりに、Javaの匿名内部クラス(コードの行数を大幅に増やします)。
  • Rubyでは、|| =演算子を使用して、式を評価し、それがfalseまたはnullと評価された場合に式に割り当てます。もちろん、3行のコードで同じことを実現できますが、なぜですか?
  • などなど...
于 2009-11-16T20:42:38.280 に答える
4

人々を混乱させるためにそれを使用してください!

于 2009-11-16T20:30:39.800 に答える
4

私は PHP を知りませんし、C ファミリーの言語で if または while 条件の外でショートサーキットが使用されているのを見たことがありませんが、Perl では次のように言うのは非常に慣用的です。

open my $filehandle, '<', 'filename' or die "Couldn't open file: $!";

すべてを 1 つのステートメントにまとめることの利点の 1 つは、変数の宣言です。それ以外の場合は、次のように言う必要があります。

my $filehandle;
unless (open $filehandle, '<', 'filename') {
    die "Couldn't open file: $!";
}

その場合、2番目の方がきれいだと主張するのは難しいです。そして、それを持っていない言語では、さらに言葉が長くなります。unless

于 2009-11-16T20:31:09.067 に答える
2

短絡演算子は、まだ言及されていない 2 つの重要な状況で役立ちます。

ケース1。である場合とそうでない場合があるポインタがあり、それが ではないこと、およびそれが指しているものNULLが ではないことを確認したいとします。ただし、ポインターが NULL の場合は逆参照してはなりません。短絡演算子がない場合は、次のようにする必要があります。NULL0

if (a != NULL) {
  if (*a != 0) {
    ⋮
  }
}

ただし、短絡演算子を使用すると、これをよりコンパクトに記述できます。

if (a != NULL && *a != 0) {
  ⋮
}

である場合は評価*aされない特定の知識で。aNULL

ケース 2。一連の関数の 1 つから返された false 以外の値に変数を設定する場合は、次のように簡単に実行できます。

my $file = $user_filename ||
           find_file_in_user_path() ||
           find_file_in_system_path() ||
           $default_filename;

$fileこれは、存在する場合は の値を設定し、true の場合$user_filenameは の結果を設定します。find_file_in_user_path()これはおそらく C よりも Perl でよく見られますが、私は C でも見たことがあります。

上記で引用したかなり不自然な例を含む、他の用途があります。しかし、これらは便利なツールであり、それほど複雑でない言語でプログラミングするときに見逃していたツールです。

于 2009-11-16T21:20:14.913 に答える
2

あなたの例は涼しさの要因だと思います。そのようなコードを書く理由はありません。

編集:慣用的な理由でそれを行うことに問題はありません。言語を使用する他のすべての人が短絡評価を使用して、誰もが理解できるステートメントのようなエンティティを作成する場合は、あなたもそうする必要があります。しかし、私の経験では、その種のコードが C ファミリー言語で記述されることはめったにありません。適切な形式は、通常どおり「if」ステートメントを使用することです。これにより、条件 (おそらく副作用がない) と、条件が制御する関数呼び出し (おそらく多くの副作用がある) が分離されます。

于 2009-11-16T20:31:56.630 に答える
1

ダンが言ったことに関連して、それはすべて各プログラミング言語の規則に依存すると思います。違いがわからないので、各プログラミング言語で慣用的なものは何でもしてください。頭に浮かぶ違いを生む可能性のあることの1つは、一連のチェックを行う必要がある場合です。その場合、短絡スタイルは代替のifスタイルよりもはるかに明確になります.

于 2009-11-16T20:56:10.000 に答える
0

真実は実際にパフォーマンスです。ショート サーキットはコンパイラで使用され、ファイル サイズと実行速度を節約するデッド コードを排除します。実行時のショートサーキットは、結果が答えに影響しない場合、論理式の残りの句を実行しないため、式の評価が高速化されます。例を覚えるのに苦労しています。例えば

a AND b AND c

この式には、左から右に評価される 2 つの項があります。

a AND b が FALSE と評価された場合、次の式 AND c は FALSE AND TRUE または FALSE AND FALSE のいずれかになります。c の値に関係なく、どちらも FALSE と評価されます。したがって、コンパイラはコンパイルされた形式に AND c を含めないため、コードをショートサーキットします。

この質問に答えるために、コンパイラが論理式に定数出力があるかどうかを判断できないため、コードをショートサーキットしない特別なケースがあります。

于 2009-11-16T21:03:09.360 に答える
0

次のようなステートメントがある場合は、このように考えてください。

if( A AND B )

A が FALSE を返した場合、B を評価する必要があるのはまれな特別なケースだけです。このため、短い回路評価を使用しないことは混乱を招きます。

また、ショート サーキット評価は、括弧で囲まれた別のインデントを防ぐことでコードを読みやすくし、括弧が追加される傾向があります。

于 2011-12-14T19:23:22.130 に答える
0

別の条件が true (または false) の場合にのみ呼び出したい右側のブール値を返す (パフォーマンスに関して) 呼び出すのにコストがかかる関数があるとしたらどうでしょうか。この場合、短絡により多くの CPU サイクルが節約されます。ネストされた if ステートメントが少なくなるため、コードがより簡潔になります。したがって、質問の最後に挙げたすべての理由からです。

于 2009-11-16T20:29:20.770 に答える