0

以下のコードをコードブロックでコンパイルしたところ、出力 0...0 が表示されました。しかし、ここでは「if」ステートメントが真ではないため、その出力は0 ... 1である必要があると思います。「if」に続くステートメントは実行されません。その後、jは1ずつインクリメントされます(「if」ステートメントのj ++のため)が、 i は 0 のままです。したがって、最後の printf() は 0...1 を与えるはずです。

#include <stdio.h>

int main()
{
    int i =0,j=0;
    if(i && j++)
        printf("%d..%d\n",i++,j);
    printf("%d...%d",i,j);
    return 0;
}
4

9 に答える 9

0

あなたが言ったように、ステートメントが偽である場合は真です。しかし、使用されている概念/ロジックがどこか不適切であると私は信じています。その理由は次のとおりです。

その前に、&&(論理積)演算子の働きを理解しましょう。If は、関連付けられた両方のオペランドが true の場合、結果のみが true であることを示します。注: 1. コンパイラの場合、いずれかのオペランドが false の場合、コンパイラはそれ以上計算しない、つまり次の有効なコード行にスキップすることを意味します。2. 0 (ゼロ) 状態は false - プログラミング中。

さて、コンパイラは最初に演算子を検索し、次にそれに関連付けられているオペランドを探します。

そのため、&&(論理 AND) の結合性は左から右であるため、コンパイラは「&&」に遭遇するとすぐに演算子の左側を調べ、左側のオペランドの値を評価します。これは 0( です。ゼロ)。ここで、注 2 を参照してから 1 を参照してください。

したがって、コンパイラは次の有効なステートメントである printf("%d...%d",i,j); にジャンプします。

ここでは、変数「j」はインクリメントされていないため、「j」の値は 0 (ゼロ) のままです。

注: アイデアをさらに明確にするために、i=1 と j=1 または i=2 と j=1 のように、i と j の値を変えて同じ例を試すことをお勧めします。

于 2013-07-16T17:06:30.190 に答える