c指针上的前缀或后缀操作

时间:2017-05-14 13:57:20

标签: c pointers

#include<stdio.h>
void increment(int *p) {
*p = *p + 1;
}
void main() {
int a = 1;
increment(&a);
printf("%d", a);
}

对于上面如果我运行上面的代码它打印2 但如果我用*p = *p + 1;替换*p++; 印刷1.为什么会这样?...

5 个答案:

答案 0 :(得分:1)

operator precedence...

撰写*p++时,您将获得以下操作:

    评估
  1. p++(稍后p将增加)
  2. 返回p的原始值(因为这是后缀++,如果它是前缀,则返回的值将为p + 1 ...)
  3. 取消引用指针p并且之前p指向1,这就是你得到的内容

答案 1 :(得分:0)

如果您查看precedence table for operators,您会看到后缀增量的优先级高于取消引用。这意味着*p++实际上会被归为*(p++)

您应该使用括号来明确您要执行的操作,在本例中为(*p)++++(*p)

答案 2 :(得分:0)

要回答此问题,请参阅table of C operator precedence:运算符+的优先级低于取消引用运算符*,而增量运算符++的优先级更高。

这就是为什么++应用于指针,而+ 1应用于指针解除引用的结果。

答案 3 :(得分:0)

了解operator precedence。检查执行(*p)++时会发生什么。

注意:您也可以尝试*(p++)。但这会调用未定义的行为 UB

答案 4 :(得分:-1)

在第一种情况*p=*p+1;中,控件将*p处的值加1,然后将结果存储在*p中。这实际上在程序运行期间使用了一个临时变量,您无法看到它。现在,临时实例的值递增并最终存储在*p中。 在第二种情况下,*p++;出现了序列点概念。

根据C标准,对象的存储值只能在两个序列点之间修改一次(通过表达式的评估)。 出现一个序列点:

  • 在完整表达结束时
  • 在&amp;&amp;,||和?:运营商。
  • 在函数调用(在评估参数之后,就在实际调用之前)

*p++;中,由于仅在遇到序列点后才修改表达式,*p无法存储其自身的修改值。