[C/C++] Cプログラミングの落とし穴 3.7 評価順序 P50

『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

代入式にインクリメントを含めると予想外な挙動が見られます。インクリメントは代入式の後に単独で書くべきだとしています。

確かにそのようなコードを書いてみると、法則性がよくわからない結果になりました。

#include <cppstd.h>

int main() {
    int x[5] = {1,2,3,4,5};
    int y[3];

    int i = 0;
    while (i < 3){
        cout << "x[" << i << "] = " << x[i] << endl;
        y[i] = x[i];
        i++;
    }

    cout << "y[0] = " << y[0] << endl;
    cout << "y[1] = " << y[1] << endl; 
    cout << "y[2] = " << y[2] << endl; 

    return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
x[0] = 1
x[1] = 2
x[2] = 3
y[0] = 1
y[1] = 2
y[2] = 3
#include <cppstd.h>

int main() {
    int x[5] = {1,2,3,4,5};
    int y[3];

    int i = 1;
    while (i < 4){
        cout << "x[" << i << "] = " << x[i] << endl;
        y[i] = x[i++];
    }

    cout << "y[0] = " << y[0] << endl;
    cout << "y[1] = " << y[1] << endl; 
    cout << "y[2] = " << y[2] << endl; 

    return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
x[1] = 2
x[2] = 3
x[3] = 4
y[0] = 0
y[1] = 0
y[2] = 2