web-dev-qa-db-ja.com

割り当てと等価性チェックを組み合わせたこのif文がtrueを返すのはなぜですか?

私はいくつかの初心者の間違いを考えていましたが、ifステートメントに間違いがありました。コードをこれに少し拡張しました:

int i = 0;
if (i = 1 && i == 0) {
    std::cout << i;
}

ifステートメントがtrueを返し、couti1iが割り当てられている場合1 ifステートメントで、なぜi == 0 return true

214
TehMattGR

これは operator precedence と関係があります。

_if (i = 1 && i == 0)
_

ではありません

_if ((i = 1) && (i == 0))
_

_&&_と_==_の両方の優先順位が_=_よりも高いためです。本当にうまくいくのは

_if (i = (1 && (i == 0)))
_

1 && (i == 0)の結果をiに割り当てます。したがって、iが_0_で始まる場合、_i == 0_はtrueなので、_1 && true_はtrue(または_1_ )、iが_1_に設定されます。次に、_1_がtrueであるため、ifブロックに入り、iに割り当てた値を出力します。

388
NathanOliver

実際にコードが次のようになっていると仮定します。

#include <iostream>
using namespace std;

int main()  {
    int i = 0;
    if (i = 1 && i == 0) {
        cout << i;
    }
}

それからこれ:

if (i = 1 && i == 0) {

として評価する

 if (i = (1 && i == 0)) {

i1に設定されます。

16
user2100815