0

私はC++の多肢選択問題を解いていました。次のコードの出力を理解できません::

#include <iostream>
using namespace std;
int main()
{
    int x,y,z;
    x=y=z=1;
    z=++x || ++y && ++z;
    cout<<x<<" "<<y<<" "<<z<<endl;
    system("pause");
    return 0;
}

私はこの質問を次のように解決しています::優先順位::

Precedence "++" greaterthan Precedence "&&" greaterthan  Precedence "||"

また、unary++の結合法則は「右から左」です。それで

z=(++x)||(++y) && (2)
z=(++x)||(2)&& (2)
z=(2)||(2)&&(2)
z=(2)|| 1  //As 2 && 2 is 1(true)
z=1       // As 2 || 1 is 1(true)

したがって、私によると、正しい出力はx = 2、y = 2、z=1である必要があります。

しかし、このコードをコンパイラーで実行すると、コンパイラーの出力はx = 2、y = 1、z=1になります。

なぜ私はそのような出力を取得し、どこで間違いを犯しているのですか?

ありがとう!

4

4 に答える 4

3

と演算子が短絡し&&ています。彼らは左側を評価し、次に値を決定するために必要な場合にのみ右側を評価します。||

したがって、の左側||がtrueの場合、右側は評価されず、の左側&&がfalseの場合、右側は評価されません。

あなたの例で++xは、true(2)なので、の右側||は評価されません。

于 2012-08-04T21:57:58.673 に答える
3

演算子の優先順位は、式をグループ化する方法を示します。実行される順序はわかりません。

||また&&、第1オペランドは常に最初に評価され、第2オペランド(すべての部分式を含む)は、式の値を決定する必要がある場合にのみ評価されるという点で特別です。

の場合、論理和の結果が常に真になるため、第||1オペランドが第2オペランドに評価される場合は評価されません。true

同様に、&&最初のオペランドが論理積としてfalseと評価された場合、の2番目のオペランドは評価されません。この場合はfalseである必要があります。

z=++x || ++y && ++zでは、文法規則でグループ化を指定します。

z = ((++x) || ((++y) && (++z)));

部分式(++x) || ((++y) && (++z))では、(2はゼロ以外であるため)と(++x)評価されるため、2番目の演算子は評価されません。2になり、変更されずに割り当てられます(整数に変換されます)。true((++y) && (++z))xyz1true

于 2012-08-04T21:59:58.573 に答える
1

論理OR演算子では、2つのオペランドのいずれかがゼロ以外の場合、条件が真になります。式A||Bで、AまたはBがゼロ以外の場合、 (A || B)brはtrueまたはに等しくなり1ます。したがって++y、 の値はである++zため、コンパイラは無視します。++x1

于 2012-08-04T22:00:47.323 に答える
1

コンパイラーは、必要な場合にのみ論理式全体を実行することに注意してください。それ以外の場合は、可能な限り少ない作業で逃げようとします。

たとえば、&&演算子を使用する場合は、両方の式を評価する必要があります。ただし、||を使用する場合 演算子(あなたが持っている)、左側の最初の式が真である場合、右側は実行されません。あなたの例では、++ xは2を与え、これはブール値のTRUEに評価されます。一度trueになると、ORステートメントがFALSEに戻ることはないため、コンパイラーの話は終わりです。この概念は、コンパイラによって「短絡」と呼ばれます。これが、説明した出力が得られた理由です。

于 2012-08-04T22:03:32.580 に答える