【问题标题】:post increment and pointer in printf [duplicate]在 printf 中发布增量和指针 [重复]
【发布时间】:2013-09-17 08:56:12
【问题描述】:

有人可以解释为什么这段代码输出2 1,我认为应该在 printf 指令之后应用后增量。

#include <stdio.h>

int main() {
  int i=1;
  int *p=&i;
  printf("%d %d\n", *p ,i++);

  return 0;
}

【问题讨论】:

  • 这个问题就像一个恶魔。采取所有形式,每天都来! :)
  • 这可能是有原因的?
  • @KingsIndian usually it is good to have multiple versions of the same question 他们经常被问到 b/c 这是不直观的结果。
  • @zubergu 我不希望每个人都知道规则。但这并不意味着这不是重复的。这个例子很容易理解,大多数 C 标记的用户可以很容易地识别它。我不认为每一个细微的变化:不同的变量名称,发生在 printf/其他函数调用中,等等都是不同的问题。我不敢相信你声称这不是那个的副本。仅仅因为它没有 `printf("%d %d\n", i ,i++);` 就意味着它不是一个 dup。有问题的 printf() 语句完全相同。
  • &KingsIndian 如果你知道它是重复的,我只是声称它是重复的。这是我想避免的重言式。

标签: c pointers printf post-increment


【解决方案1】:

在标准中这种情况的评估顺序是not specified,因此您无法确定是先评估*p还是i++C99 draft standard6.5.2.2 部分中说 函数调用10 说:

函数指示符的求值顺序、实际参数和 实际参数中的子表达式未指定,但有一个序列点 在实际通话之前。

这也是 undefined behavior,因为您正在修改 i 并在同一序列点内的另一个表达式中访问 i 的先前值,6.5 部分中的标准草案 表达式2 段说:

在上一个和下一个序列点之间,一个对象应该有它的存储值 通过表达式的评估最多修改一次。72) 此外,先验值 应为只读以确定要存储的值

【讨论】:

    【解决方案2】:

    逗号是一个序列点,但不在函数调用中。
    而 printf 是一个参数用逗号分隔的函数。
    在这样的表达式中:
    if(i+2,i++). . . 逗号是一个序列点,并确保表达式将从左到右进行计算,并且表达式的最终值将是最右边的子表达式的值。在这种情况下i++.
    另一方面,在函数调用中:
    function(i+1,i++,i--) 逗号不是序列点,任何子表达式都可以作为第一个计算。唯一可以确定的是,它们都会被评估,但不是按照任何特定的顺序。

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2011-06-10
      • 1970-01-01
      • 2015-12-27
      • 2015-05-15
      • 2011-10-08
      相关资源
      最近更新 更多