C语言打印自增的先后问题
第一波打印为啥先5后4啊??
第三波打印为啥先1后2??
int main() {
int i=4;
printf("ok: %d %d\n", i++, i++);
printf("ok: %d %d\n", ++i, ++i);
printf("ok: %d %d\n", i++, i=1);
}
ok: 5 4
ok: 8 8
ok: 1 2
C语言打印自增的先后问题
第一波打印为啥先5后4啊??
第三波打印为啥先1后2??
int main() {
int i=4;
printf("ok: %d %d\n", i++, i++);
printf("ok: %d %d\n", ++i, ++i);
printf("ok: %d %d\n", i++, i=1);
}
ok: 5 4
ok: 8 8
ok: 1 2
以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
这个问题的原因在于 printf
函数的行为并不是按照我们预期的那样进行。当我们讨论到自增操作 i++
时,其实这是一个后置自增操作,这意味着返回当前 i
的值之后再进行自增操作。所以在这个程序中发生的事情是这样的:
printf
函数中使用 i++
,函数接收的是 i
的当前值,然后将它输出为 %d
的占位符所对应的参数,这个时候并没有真正改变 i
的值。接着由于这两个参数一起传递并分别赋值给了两个 %d
占位符,因此第二个 i++
也获取了当前的 i
值。因此,在第一次打印时,第一个 %d
会输出当前的 i
值,也就是 4
。之后在执行下一个操作前(也就是在格式化字符串完成赋值之后),会进行第一次的自增操作,使得 i
变为 5
。然后在打印时第二次 %d
会打印这个已经自增后的值 5
。所以你会看到输出结果是 ok: 4 5
。这就是为什么你会看到先打印出 5
后打印出 4
的原因。这与函数的调用栈、局部变量等在背后共同作用的结果。对于C语言的这个行为特点应该牢记。不过通常不建议在一条语句中连续使用后置自增操作,因为这可能会导致混淆和误解。