3

条件演算子について簡単な質問があります。ここではまだ新進のプログラマーです。x = 1、y = 2、z = 3 が与えられます。

なぜこの声明の後に知りたいのですか:

y += x-- ? z++ : --z;

y は 5 です。ステートメントの後の値は、x = 0、y = 5、および z = 4 です。条件演算子が機能する方法は、次のようにフォーマットされていることを知っています。true の場合の値: false の場合の値。

条件 y += x-- の場合、y はどのように 5 になりますか? 可能性として 2 (2 += 0) と 3 (2 += 1) (x-- がゼロになる) しか見えません。どんな助けでも大歓迎です。:)

4

13 に答える 13

10

条件 (x != 0) を評価すると、x はまだ 1 (つまりnot 0) です。だからそれは選ぶz++。これはまだ 3 です。2 + 3 = 5 です。1 日の終わりに、x は 0 になり、z は 4 になりました。

詳細はこちらをご覧ください。簡単なことを覚えておくことが重要です: x ++x の現在の値が使用され、それがインクリメントされると言う場合。あなたが言うとき、それ++xは最初にインクリメントされてから使用されます。

于 2010-05-19T18:37:50.503 に答える
7

演算子 ?: は、演算子 += よりも優先されます。したがって、式は次のように評価されます

y += (x-- ? z++ : --z);

式の値は 1であるため、式の値はx-- ? z++ : --z式の値z++(つまり 3) です。x--

于 2010-05-19T18:42:14.997 に答える
6

if同様のステートメントに分解してください:

if (x--)
    y += z++;
else
    y += --z;

あなたの場合、xis1なので、この if ステートメントの「真」の側を取ります。つまり、 に追加z++y、 を与え3 + 2、結果として が得られ5ます。

このようなコードを書かないでください。

于 2010-05-19T18:40:06.870 に答える
1

新進のプログラマーとして、このようなことを決して書いてはならないことを知っているだけです。そうすれば、心配することを忘れることができます!

于 2010-05-19T18:40:41.440 に答える
0

この理由は、ポスト デクリメント/インクリメント演算子 (x++またはx--) が次のことを行うためです。

  1. 変数をインクリメントまたはデクリメントする
  2. 元の値を返します。

したがって、 の戻り値x--は 1 であり、true を示しているため、ステートメントz++が評価され、元の値 3 が返されます。

以来y = 2y += 3です5

于 2010-05-19T18:39:52.110 に答える
0

x-- は、式が x の現在の値で評価され、その後 x が 1 減らされることを意味します。Z++ の場合も同様です。--z の場合は逆で、これは z の新しい値で評価されることを意味します。

したがって、評価時に x は 1、z は 3 です。式の評価後、x は 0 になり、z は 4 になります。y = 2 + 3 = 5

于 2010-05-19T18:40:34.313 に答える
0

y += (x-- ? z++ : --z); これはあなたの質問であり、答えは簡単です......

私たちが知っているように、X-- や x++ のようなものはポスト インクリメントまたはポスト デクリメントと呼ばれます。そのため、ポスト インクリメントまたはデクリメントのルールに従って、最初に式が評価され、次にインクリメントまたはデクリメントのみが実行されます。つまり、最初に評価してから増減します.....

今すぐあなたの質問を解決しましょう:

Y+=X--?Z++:--Z....現在、左、中央、右の 3 つの部分が含まれています...ここで考慮すべき点は次のとおりです。「左部分が true の場合、中央部分が返され、それ以外の場合は右側の部分...条件部分であるため、常に左側の部分から実行が開始されます"

ステートメントを次のように単純化します: Y+=X?Z:Z;....左の部分が前または後のインクリメントまたはデクリメントを持っているかどうかを確認します.....ポスト ++/-- が der den の場合は、最初に簡略化されたものを評価しますステートメント...... + +/- - を使用してください.....

左部分には後置デクリメントがあります...最初に式を評価しましょう...つまり

y+=1:3:3 //条件部分のゼロ以外の値は真の条件 (つまり 1)

これで、条件が true になり、中央部分が返され、その時点でコントロールが中央部分に移動すると、x 値のみが減分されます。つまり、0 になります....

2 番目の単純化されたステートメントは Y+=Z です。(\\条件が真で、中間部分を取得したため、コンパイラは残りの部分、つまり右側部分をスキップします。)

ここで、Z がポスト ++/-- (または)プレ ++/--) であるかどうかを観察します...はぁ..そのポストインクリメント..最初に単純化されたステートメントを評価し、次に Z の値を増やします....すなわち

                     Y+=Z =>Y=Y+Z
                    =>Y=2+3 =>y=5

式が評価されると、つまり Y=5 になるので、Z の値をインクリメントします。つまり、4 になります。

于 2013-07-20T14:57:52.480 に答える
0

インクリメント演算子とデクリメント演算子は、変数名の前または後に配置されているかによって、異なるものを返すことに注意してください。

特に、が評価されると、 1x--だけ減少しますが、 の未変更の値 (この場合は 1) を返します。C では、1 は true と評価されるため、三項演算子は を返します。xxz++

また、++ 演算子が変数の後に配置されているため、 の戻り値z++は の変更されていない値z、つまり 3 です。

したがって、これは になりy += 3、結果はy5 になります。

于 2010-05-19T18:40:37.323 に答える
0

x-- および z++ は、使用後にデクリメントおよびインクリメントします。三項演算子が評価されると、次のようになります。

y += (1) ? (3) : (--z);

--z は呼び出されず、条件は true と評価され、三項演算子の最初のオプションを実行します。使用後、x はデクリメントされ、z はインクリメントされます。

于 2010-05-19T18:41:47.650 に答える
0

最初に三項演算子を「実行」し、デクリメント演算子 (x--) が後置であるためデクリメントを行うため、正常です。したがって、3 である z++ を取得すると、y に 5 が含まれます。

于 2010-05-19T18:42:17.603 に答える
0

x--は の現在の値x、つまり 1 に評価されます。したがって、条件式の結果は でありz++、これは 3 に評価されます。3 が に加算されy、合計 5 になります。

于 2010-05-19T18:45:48.947 に答える
0

ここでのあなたの根本的な問題はy+= x--、実際にはあなたの状態が単にx--. y +=条件演算の結果を5 にする条件演算からの戻り値がありx-- ? z++ : --z;ます。他のコメントには、実際に 5 に評価される理由があります。

于 2010-05-19T18:47:42.643 に答える