繁体   English   中英

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

[英]prefix or postfix operation on c pointer

#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.为什么会这样?...

运算符优先级...

编写*p++您将获得以下操作:

  1. p++进行评估(以后的p将递增)
  2. 返回p的原始值(因为这是一个后缀++ ,如果它是前缀,则返回的值将是p + 1 ...)
  3. 取消对指针p引用,并且由于p早先指向1 ,这就是您得到的

如果查看运算符优先级表,您会发现后缀增量的优先级高于取消引用的优先级。 这意味着*p++实际上将被分组为*(p++)

在这种情况下(*p)++++(*p) ,您应该使用括号来明确说明您要执行的操作。

要回答此问题,请查阅C运算符优先级表 :运算符+优先级比取消引用运算符*优先级低,而增量运算符++优先级更高。

这就是为什么++应用于指针,而+ 1应用于指针取消引用的结果的原因。

了解有关运算符优先级的信息 检查执行(*p)++时会发生什么。

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

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

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

  • 在完整表达式的末尾
  • 在&&,|| 和?:运算符。
  • 在函数调用时(在参数求值之后,在实际调用之前)

*p++; ,因为仅在遇到序列点之后才修改表达式,所以*p无法存储自身的修改后的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM