printf 函数是如何工作的? [复制]

Posted

技术标签:

【中文标题】printf 函数是如何工作的? [复制]【英文标题】:how printf function work? [duplicate] 【发布时间】:2012-04-13 21:54:23 【问题描述】:

可能重复:Undefined Behavior and Sequence PointsHow the statement x=x++ + y++; executes to the value 3?

我想知道 printf 在这种情况下是如何工作的:

int i = 0;
printf("%4d%4d", i++, i);

结果是 0 1

另一种情况

int i = 0;
printf("%4d%4d", i, i++);

结果是 1 0

【问题讨论】:

在一个语句中使用 i++ 和 i 是未定义的行为。它可以打印任何东西。见***.com/q/4401104/79455 你的意思是 i++ 在这些情况下是如何工作的。 @rve: 在一个语句中使用i++i 可以 可以;问题是当它们在没有干预序列点的情况下进行评估时。 请阅读comp.lang.c FAQ的第3部分。 @KeithThompson:我们又来了。相同的标签,相同的时间和相同的 Q :) 【参考方案1】:

这与 printf 无关,与评估参数的顺序和编译器执行代码的方式有关。行为未定义,结果将取决于您的编译器、调用约定和月相。

在您的两个示例中,前/后递增规则优先。您的特定编译器知道它必须在评估增量之前使用i 的值,并且优先于调用函数调用的参数而不是不调用的参数。您对变量i 的第二次使用导致编译器在调用printf 的过程中插入中间语句,

重要的是要注意i++ 并不意味着(如通常所教导的那样)“在执行此行后增加 i”,它只是表示“在给我它的值之后,在执行下一个之前的某个时刻增加 i线”。编译器有很大的回旋余地来执行正式称为“未定义的行为”。

正如@Als 在评论中指出的那样,您已经成功地将未定义和未指定的行为结合在一行代码中。

【讨论】:

未指定函数参数的评估顺序。在没有插入序列点的情况下多次修改变量是 Undefeind Behavior。【参考方案2】:

这不是由于 printf 而是因为您处于 未定义行为

【讨论】:

以上是关于printf 函数是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

04 printf 命令

04 printf 命令

printf函数用于啥?

从技术上讲,可变参数函数是如何工作的? printf 是如何工作的?

4-printf & scanf函数

如何通过在 printf("%ex",test()) 中定义新标识符在 C 中打印布尔类型来启用 printf() 函数? [复制]