2026-08-27
fill_array.c
#include <stdio.h>
int main(void) {
int a[3];
int i = 0;
while (i < 3) {
a[i] = i++;
}
for (int j = 0; j < 3; j++) {
printf("%d ", a[j]);
}
printf("\n");
}
このループはaを{0, 1, 2}にするつもりですが、a[i] = i++;は未定義動作(undefined behavior)です。何が問題で、どう直せばよいでしょうか?
Answer
a[i] = i++;は、左辺で添字としてiを読み取りながら、右辺の後置インクリメントが同じiを書き換えるという副作用を、同じ式の中で起こしています。この2つの間には副作用完了規則(sequence point)がないため、aのどの要素に書き込まれるかはコンパイラ次第で変わり得ます。最小限の修正は、読み取りとインクリメントの副作用を別の文に分けることです:
while (i < 3) {
a[i] = i;
i++;
}