楽しみのために、次のコード スニペットを用意しました。
#include <stdio.h>
main()
{
int i;
int a;
i = 17;
//scanf("%d", &i);
a = (i+=5) * (i-=3);
printf("a is %d, i is %d\n", a, i);
}
C 仕様では、オペランド評価の順序がundefinedと書かれているため、22 * 19 または 19 * 14 のいずれかが表示されると予想していました。しかし、結果は 19 * 19 です。
~ $ gcc a.c
~ $ ./a.out
a is 361, i is 19
私が思いついた唯一の説明は、コンパイラが の値に対して「遅延」評価を行い、の値は単に i の値である(i+=5)
と考えたということです。(i+=5)
についても同じです(i-=3)
。
ただし、次のコメントを外すとscanf()
:
#include <stdio.h>
main()
{
int i;
int a;
i = 17;
scanf("%d", &i);
a = (i+=5) * (i-=3);
printf("a is %d, i is %d\n", a, i);
}
プロンプトで 17 を入力します。
~ $ gcc a.c
~ $ ./a.out
17
a is 418, i is 19
異なる動作を示すのはなぜですか?