所以只是为了好玩,我有这个代码片段:
#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+=5)
' 的值进行了“延迟”评估,它认为(i+=5)
' 的值只是 i 的值。对于(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
为什么它表现出不同的行为?