[C言語] Cプログラミングの落とし穴 6.2 マクロは関数ではない P85 その2

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

この本はいわゆるANSI C(C89規格)策定中に書かれており、今読んでいるところについてはC89では修正されているようです。つまり”マクロは関数である”という状態になっています。

下記コードではmaxマクロ内の数値比較と数値選択のところで計2回インクリメントが出現するので、x[1]が飛ばされx[2]にあたる1が選択されて変数biggestは1になってしまうという著者の指摘通りにはなりません。

biggest = ((biggest) > (x[i++])?(biggest) : (x[i++]));

#include <stdio.h>

#define N 3
#define max(a,b) ((a) > (b) ? (a):(b))

int main() {
    int x[N];
    x[0] = 2;
    x[1] = 3;
    x[2] = 1;
    
    int biggest = x[0];

    int i = 0;
    while (i < N){
        biggest = max(biggest, x[i++]);
    }

    printf("biggest : %d\n", biggest);

    return 0;
}
biggest : 3