4

このコードを検討してください (C++):

int x = -4 , y = 5 ;
bool result = x > 0 && y++ < 10 ;

式 (x > 0) が最初に評価されます。(x > 0 = false) と短絡評価のため、他の式 (y++ < 10) は評価されず、y の値は 5 のままです。 .

次のコードを検討してください。

int x = -4 , y = 5 ;
bool result = (x > 0) && (y++ < 10) ;

括弧内の式が最初に評価されるため、論理積が実行される前に、式 (y++ < 10) が評価されて y の値が 6 になることが予想されますが、実際には y の値は5のままです。これは、括弧があっても評価が短絡され、式 (y++ < 10) が無視されることを意味します。

この場合の説明は何ですか?!

4

3 に答える 3

10

説明は質問にあります-ショートサーキット

C++ では、&&(さらに言えば) の評価は||左から右であることが保証されており、false(それぞれtrueについて||) が検出されるとすぐに、評価が停止することが保証されています。

Javaについても同様だと思います。

括弧は冗長であり、この場合は関係ありません。演算子の優先順位とは関係ありません。それは単にどのように機能するかに関係しています&&:

実はこの2つのバージョン

x > 0 && y++ < 10
(x > 0) && (y++ < 10)

++の優先順位が最も高く、その後に<,>、最後にが続くため、同等&&です。辛辣に、あなたはそれを次のように書くべきでした:

(x > 0) && ((y++) < 10)

5.14 論理積演算子 [expr.log.and]

1&&オペレーターは左から右にグループ化します。オペランドは両方とも bool 型に暗黙的に変換されます (節 4)。両方のオペランドがそうtrueでない場合、結果は真ですfalse& とは異なり、&& は左から右への評価を保証します。最初のオペランドが の場合、2 番目のオペランドは評価されませんfalse(私のものを強調)

于 2012-10-10T21:56:17.753 に答える
1

左側が結果を決定する場合、右側は評価されません。

最初のケースでは、右辺はy++ < 10であり、これは評価されません。2 番目のケースでは、右側が(y++ < 10)であり、これは評価されません。

括弧内の式が最初に評価されるという規則はありません。括弧はオペランドのみをグループ化します。

于 2012-10-10T21:57:37.047 に答える
0

括弧があっても短絡は発生しなければなりません。ポインターを含む式があるかどうかを検討してください。

int* ptr = 0;
int bar = 5;
bool result = (ptr != 0) && (*ptr == bar || bar > 10);

そこの右側を安全に評価できないことは明らか&&ですが、優先順位を意図したとおりに機能させるには括弧が必要です。括弧は、実際に実行される操作の順序を決定するだけであり、特定の順序で実行されるわけではありません。

于 2012-10-10T22:00:08.537 に答える