【问题标题】:Why doesn't this program print '4'? [duplicate]为什么这个程序不打印'4'? [复制]
【发布时间】:2019-06-10 08:15:29
【问题描述】:

*ptrj++执行后ptrj值不应该是4吗?

int j=3,*ptrj = NULL;
ptrj = &j;
*ptrj++;
printf("%i",*ptrj);

【问题讨论】:

  • 这个程序打印的是什么?
  • 它打印 0,它还表示 *ptrj++ 的结果是未使用的
  • 这就是为什么*ptr++ 是不好的风格,不管多么常见。人们一直对这个过去 40 年的 C 故事感到困惑。好的程序员写ptr++在自己的一行,糟糕的程序员写“惯用的”goo,比如*dst++ = *src++
  • 我不明白这里的接近投票。这完全足以重现问题,而且不是简单的印刷错误。
  • @AndrasDeak 嗯,不能反驳这一点。 :)

标签: c pointers postfix-operator


【解决方案1】:

*ptrj++*(ptrj++) 相同。你所期望的是(*ptrj)++。您应该查看 运算符优先级 以了解更多关于哪些运算符先于其他运算符。要了解ptrj++ 的作用,您应该阅读指针算法。但这里有一个简单的解释:

  • *(ptrj++) 返回 ptrj 指向 (3) 的值,然后将 ptrj 递增以指向下一个值。

  • (*ptrj)++返回ptrj指向的值(3),然后将ptrj指向的从3增加到4。

这意味着您要打印的是地址&j + 1 处的值,该值位于内存中变量j 的右侧之后。这是未定义的行为。正如 Sourav 指出的那样,如果您启用编译器警告,您会收到一条警告,指出这一点。

*ptrj++ptrj++ 之间的唯一区别是它返回的内容。而且由于您不使用返回值,因此您的代码相当于:

int j=3,*ptrj = NULL;
ptrj = &j;
ptrj++;
printf("%i",*ptrj);

【讨论】:

  • 好的,你提到了 printf 参数,我现在明白了。
【解决方案2】:

如果您在启用警告的情况下编译程序,您会看到

source_file.c:9:5: warning: value computed is not used [-Wunused-value]
     *ptrj++;
     ^

也就是说,值计算是没有用的。

也就是说,根据operator precedence*ptrj++;*(ptrj++);相同,并且根据后自增运算符属性,运算的值就是操作数的值,值递增作为副作用。

引用C11,章节

后缀++ 运算符的结果是操作数的值。作为一个副作用, 操作数对象的值递增(即相应类型的值 1 为 添加到它)。 [....]

所以,这是一样的

 *ptr;
  ptr++;

如果要在地址处增加 ,则需要通过使用显式括号来强制运算符优先级,例如

(*ptrj)++;   // first get the value, then update the value.

【讨论】:

    【解决方案3】:

    *ptrj++ 等价于 *(ptrj++)。

    可以使用 (*ptrj)++ 实现所需的输出。

    请参考https://www.geeksforgeeks.org/c-operator-precedence-associativity/了解操作员的工作原理。

    【讨论】:

      【解决方案4】:

      后缀 ++ 的优先级高于 *。表达式 *ptrj++ 被视为 *(ptrj++) 因为后缀 ++ 的优先级高于 *。如果要打印 4 (即 ptrj+1 ),则应使用以下代码:-

      int j=3,*ptrj = NULL;
      ptrj = &j;
      (*ptrj)++;
      printf("%i",*ptrj);
      return 0;
      

      要了解有关运算符优先级的更多信息,请参阅以下链接: https://en.cppreference.com/w/c/language/operator_precedence

      【讨论】:

        猜你喜欢
        • 2011-10-28
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 2017-07-30
        相关资源
        最近更新 更多