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

可能重复:
Undefined Behavior and Sequence Points
How 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 是未定义的行为。它可以打印任何东西。见stackoverflow.com/q/4401104/79455
  • 你的意思是 i++ 在这些情况下是如何工作的。
  • @rve: 在一个语句中使用i++i 可以 可以;问题是当它们在没有干预序列点的情况下进行评估时。
  • 请阅读comp.lang.c FAQ的第3部分。
  • @KeithThompson:我们又来了。相同的标签,相同的时间和相同的 Q :)

标签: c++ c


【解决方案1】:

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

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

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2011-05-07
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多