printf和i ++的奇怪行为

时间:2014-11-19 15:50:02

标签: c

我总是忘记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

为什么会这样?

2 个答案:

答案 0 :(得分:7)

您有未指定和未定义的行为:

未指定的行为:您不知道printf调用中参数的评估顺序。 (C标准没有规定这一点:它取决于编译器,它可以自由选择最符合机器架构的方式。)

未定义的行为:函数调用中的逗号是不是排序点。由于您尝试在没有插入序列点的情况下尝试读取和修改同一对象,因此行为未定义。

答案 1 :(得分:-3)

因为在你的第一个阻止i 6after printf语句中,它会增加,因为它是postfix

之后在second printf语句中prefix并执行before它将被使用,因此7 + 1 = 8。

在第二个代码块i中,6语句中的printfpostfix,因为它是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语句的参数的评估顺序!