我总是忘记i++
和++i
中的哪一个返回哪个值。为了测试这个,我编写了以下代码:
int i;
i = 6;
printf ("i = %d, i++ = %d\n",i, i++);
printf ("i = %d, ++i = %d\n",i, ++i);
产生的(意外和奇怪的)输出是:
i = 7, i++ = 6
i = 8, ++i = 8
但是当我将printf
分解为4个单独的命令时,我得到了预期的结果:
printf ("i = %d, ",i);
printf ("i++ = %d\n",i++);
printf ("i = %d, ",i);
printf ("++i = %d\n",++i);
给出:
i = 6, i++ = 6
i = 7, ++i = 8
为什么会这样?
答案 0 :(得分:7)
您有未指定和未定义的行为:
未指定的行为:您不知道printf
调用中参数的评估顺序。
(C标准没有规定这一点:它取决于编译器,它可以自由选择最符合机器架构的方式。)
未定义的行为:函数调用中的逗号是不是排序点。由于您尝试在没有插入序列点的情况下尝试读取和修改同一对象,因此行为未定义。
答案 1 :(得分:-3)
因为在你的第一个阻止i
6
和after
printf
语句中,它会增加,因为它是postfix
!
之后在second
printf语句中prefix
并执行before
它将被使用,因此7 + 1 = 8。
在第二个代码块i
中,6
语句中的printf
为postfix
,因为它是7
!这就是为什么第二个输出是prefix
而最后一个printf语句有一个before
增量,所以它被递增8
它被使用并且是i++ //gets incremented AFTER it gets used (e.g. in a operation)
++i //gets incremented BEFORE it gets used (e.g. in a operation)
!
前缀/后缀:
{{1}}
修改强>
未指定printf语句的参数的评估顺序!