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 函数是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
从技术上讲,可变参数函数是如何工作的? printf 是如何工作的?
如何通过在 printf("%ex",test()) 中定义新标识符在 C 中打印布尔类型来启用 printf() 函数? [复制]