『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