40

PHP コード内

if(a() && b())

最初のオペランドが に評価される場合、 は評価されfalseませb()ん。

同様に、

if (a() || b())

最初のオペランドが に評価される場合、 は評価されtrueませb()ん。

これは、Java、C# などのすべての言語に当てはまりますか?

使用したテストコードです。

<?php
function a(){
echo 'a';
return false;
}

function b(){
echo 'b';
return true;
}


if(a() && b()){
echo 'c';
}
?>
4

17 に答える 17

68

これを短絡評価と呼びます。

一般に、C から派生した言語 (C、C++、Java、C#) には当てはまりますが、すべての言語に当てはまるわけではありません。

たとえば、VB6 はこれを行わず、VB.NET の初期のバージョンでも行われませんでした。VB8 (Visual Studio 2005) では、この目的のためにAndAlsoおよびOrElse演算子が導入されました。

また、コメントから、csh は短絡評価を右から左に実行して、問題をさらに混乱させているようです。

また、短絡評価 (または不足) には注意すべき危険性があることも指摘しておく必要があります。たとえば、2 番目のオペランドが何らかの副作用を持つ関数である場合、コードはプログラマが意図したとおりに実行されない可能性があります。

于 2009-08-05T11:19:15.207 に答える
20

VB6には当てはまりません。

VB.net では、2 番目の式の評価をスキップする場合は、"And" の代わりに "AndAlso" を使用する必要があります。

于 2009-08-05T11:18:19.703 に答える
12

これは、JAVA、C# などのすべての言語に当てはまりますか?

C# では、これは短絡演算子 ' ||' と ' &&' にのみ当てはまります。|' ' または ' 'だけを使用する&と、毎回両側が評価されます。

于 2009-08-05T11:24:09.800 に答える
12

これは短絡評価と呼ばれ、ほとんどの言語がこれを行います。一部の言語では、これを行わない演算子が存在します。

于 2009-08-05T11:19:18.843 に答える
8

Pascal の元のバージョンはそうではなかったため、多くの悲しみが生じました。Delphi などの最新の Pascal は、C などと同じように機能します。

于 2009-08-05T11:21:08.887 に答える
7

Ada には、特殊な短絡形式の条件文があります。

and then
or else

次のように使用します。

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y

プログラマーが式を短絡する必要があることを知っていて、条件が偶然に機能していないことを推測できるので、ある意味では良いことです。

于 2009-08-05T11:30:54.607 に答える
5

これは、C の「子」である言語 (PHP、Java、C++、C# など)、または Perl のように同じ「インスピレーション」にある言語に当てはまります。

しかし、これは VB には当てはまりません (少なくとも、そのための新しいキーワードが導入された .NET より前は)。
(そして、VB を初めて使用する場合は、これが非常に厄介です ^^ )

于 2009-08-05T11:20:42.973 に答える
4

Microsoft VBScript (「クラシック」ASP と組み合わせて使用​​されることが多い) には、ブール演算子の短絡評価がなく、代わりにビットごとの評価が使用されます。それがおそらく史上最悪の言語である多くの理由の1つです!

「何が起こっているのかというと、VBScript は論理的ではないということです。VBScript はビット単位です。いわゆる論理演算子はすべて、ブール値ではなく数値で機能します! Not、And、Or、XOr、Eqv、および Imp はすべて、引数を 4 バイトに変換します。整数, 整数のビットの各ペアで論理演算を行い, 結果を返します. True が -1 で False が 0 の場合, -1 はすべてのビットがオンになり, 0 はすべてのビットがオンになるため, すべてうまくいきます.オフ. しかし、他の数字がそこに入ると、すべての賭けはオフになります.

このブログから引用。エリック・リッパート著。

于 2009-08-05T12:59:37.587 に答える
3

Delphiでは、これはコンパイラオプションです。

于 2009-08-05T12:53:17.120 に答える
3

標準の FORTRAN または Fortran では、ブール式のオペランドは任意の順序で評価できます。不完全な評価は許されますが、実装は定義されています。

これにより、厳密な左から右への順序付けが適用された場合には許可されないブール式の最適化が可能になります。厳密な順序付けが必要な式は、個別の条件に分解する必要があります。そうしないと、実装に依存する仮定を行うことができます。

順序付けを強制するために分解が使用されるため、個別の IF ステートメントを常に単一の式に最適化できるとは限りません。ただし、短絡評価は分解によって明示的であり、遅延評価を許可するために厳密な左から右への順序付けを強制する言語よりも悪いことはありません。

FORTRAN から派生した言語 (Fortran、BASIC、VBn)、および FORTRAN のような効率を達成するように設計された言語 (Pascal、Ada) は、当初、アウトオブオーダー評価を許可する FORTRAN の例に従いました。

于 2015-03-17T11:24:47.413 に答える
2

これは Java にも当てはまりますが、演算子 | や & などは両側を評価します。

于 2009-08-05T11:22:45.543 に答える
2

ほとんどの言語 (私が見たすべて) は、&& や || などの条件演算子で短絡評価を使用します。条件の 1 つが要件を満たすとすぐに評価を停止します。(&& の最初の false。|| の最初の true)

& や | などのすべての BINARY 演算子が処理されます。(オリジナル)

& や | などのすべての BITWISE 演算子が処理されます。(編集: 5/10/17)

于 2009-08-05T12:01:46.823 に答える
2

これは短絡評価と呼ばれ、VB、VB.NET、および Fortran を除く、私がこれまでに使用したすべての言語 (C、C++、C#、Java、Smalltalk、Javascript、Lisp) に共通しています。

実際、かなり便利な機能です。短絡しないと、これを行うことはできません。

if (a != null && a.isBlank())

a が null の場合、2 番目の部分でエラーがスローされるため、短絡しないと if ステートメントをネストする必要があります。

于 2009-08-05T11:30:47.150 に答える
2

Erlang では、andandor演算子は短絡評価を行いません。短絡動作が必要な場合はorelse、 and演算子を使用する必要があります。andalso

于 2009-08-05T13:59:22.193 に答える
1

MATLAB は、「標準」の論理演算子短絡演算子を区別する言語の 1 つです。

  • & (AND 演算子) および | (OR 演算子) は、要素ごとに配列を操作できます。
  • && と || 結果が最初のオペランドによって完全に決定されない場合にのみ、2 番目のオペランドが評価される短絡バージョンです。これらは、配列ではなく、スカラーでのみ操作できます。
于 2009-08-05T14:22:23.567 に答える
1

Coldfusion は、ネイティブで短絡評価を行います。すべての CF 開発者が次のように書いていると確信しています。

<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>
于 2009-08-05T11:33:33.043 に答える
0

他の回答では、短絡評価の有無にかかわらず言語の良い例が示されているため、繰り返しません。

興味深い点を 1 つだけ追加します。Clojure などの Lisp にはブール型の短絡評価がありますが、さらに、マクロを使用して短絡評価で任意の演算子を簡単に定義できます。

Clojure での短絡 "nand" 操作の例:

(defmacro nand 
  ([x] 
    `(not ~x))
  ([x & xs] 
    `(let [nand# (not ~x)]
       (if nand# 
         true               ; short circuit if we can prove the nand is true
         (nand ~@xs)))))    ; continue with the other expressions otherwise

(nand true true)
=> false

(nand false (println "Expression with a side effect!"))
=> true
于 2011-11-19T08:55:32.593 に答える