-1

次のコードを書きました。

int main(){

int i=-1,j=-1,k=0,l=2,m;
m = i++ && j++ && k++ || l++;
printf("%d %d %d %d %d",i,j,k,l,m);

i=-1,j=-1,k=0,l=2,m;
m = ++i && ++j && ++k || ++l;
printf("\n%d %d %d %d %d",i,j,k,l,m);
    return(0);
}

そして、私は次の結果を得ました:

    0 0 1 3 1

    0 -1 0 3 1

私が知っているように、後置演算子と前置演算子はセミコロンの後に解決されます。元の値が式で使用され、変数が解決されます。その場合

     i++ && j++ 

に等しい必要があります

      ++i && ++j 

両方とも同等である必要があります

     i && j;
     i = i+1;
     j = j+1;

したがって、2 つの式の結果は同じでなければなりません。しかし、そうではありません。どこで間違った概念を持っているのか、誰でも助けてください。

4

2 に答える 2

3

i++ && j++は絶対に と同等ではありません++i && ++j

両方がゼロの場合を考えてみましょう - 最初の結果は次のようになります:

0 && j++

0 の結果が得られます (短絡のため、j はインクリメントされません)。

2 番目のケースでは、次のようになります。

1 && 1

1 の結果が得られます。

それを念頭に置いて、例を見てみましょう(読みやすくするためにスペース、セミコロン、改行を追加しました):

  1. 最初に:

    int i = -1;
    int j = -1;
    int k =  0;
    int l =  2;
    int m = i++ && j++ && k++ || l++;
    

    扱いやすくするために、最初に完全に括弧で囲みます。

    int m = ((i++ && j++) && k++) || l++;
    

    それで、何が起こるでしょうか?まず、i++. iはインクリメントされます(そして になります0)が、ポストインクリメントであるため、式の結果は-1です。それは与える:

    int m = ((-1 && j++) && k++) || l++;
    

    その左辺&&は非ゼロなので、右辺が評価されます。 j++にインクリメントjします0が、後置インクリメントは式の値が であることを意味します-1

    int m = ((-1 && -1) && k++) || l++;
    

    それを解決し&&ます:

    int m = (1 && k++) || l++;
    

    次に残りの右側&&kはインクリメントされ、 になります1が、式は次のようになります0

    int m = (1 && 0) || l++;
    

    これを解決します&&:

    int m = 0 || l++;
    

    最後に、 の左側||が 0 であるため、右側が評価されます。 lはインクリメントされ、 になります3が、ポストインクリメントとして、次のようになります2

    int m = 0 || 3;
    

    ついに:

    int m = 1;
    

    そして、途中で次のようになりました。

    i = 0;
    j = 0;
    k = 1;
    l = 3;
    

    初めてのプリントアウトについて説明します。

  2. 次に、2 番目の例を見てみましょう (より要約されています。詳細が必要な場合はお知らせください)。

    int i = -1, j = -1, k = 0, l = 2, m;
    m = ((++i && ++j) && ++k) || ++l;   // parenthesized for readability
           ^                            // i is pre-incremented
    m = (( 0  && ++j) && ++k) || ++l;
               ^                        // first && operator short-circuits
    m = (0 && ++k) || ++l;
            ^                           // second && operator short-circuits
    m = 0 || ++l;
              ^                         // l is pre-incremented
    m = 0 || 3;
           ^                            // evaluate || operator
    m = 1;
    

    結果は次のとおりです。

    i =  0
    j = -1
    k =  0
    l =  3
    m =  1
    

    まさにあなたが見たものが印刷されました。

于 2013-06-07T19:54:36.963 に答える