2026-08-27
countdown.c
#include <stdio.h>
int main(void) {
int n = 3;
while (n --> 0) {
printf("%d ", n);
}
printf("\n");
}
これは何を出力するでしょうか?
Answer
2 1 0(その後に改行)。n --> 0は「goes to」という専用演算子ではなく、n-- > 0という後置デクリメントと比較演算子の並びです(最大読み込み規則(maximal munch)により--が1つのトークンとしてまとめられます)。後置デクリメントは「今の値を式の結果として使ってから、変数を1減らす」ので、比較には3・2・1・0という減る前の値が使われ、その直後にprintfされるのはすでに1減った後の値です。もし前置の--n > 0に書き換えると、比較にも減った後の値が使われるため、ループは2回しか回らず出力は2 1になります。