![](/img/trans.png)
[英]In C for postfix and prefix operator, operand should be an lvalue, so what actually lvalue means for a pointer variable in case of these operators?
[英]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++
您将获得以下操作:
p++
进行评估(以后的p将递增) p
的原始值(因为这是一个后缀++
,如果它是前缀,则返回的值将是p + 1 ...) p
引用,并且由于p
早先指向1
,这就是您得到的 要回答此问题,请查阅C运算符优先级表 :运算符+
优先级比取消引用运算符*
优先级低,而增量运算符++
优先级更高。
这就是为什么++
应用于指针,而+ 1
应用于指针取消引用的结果的原因。
在第一种情况下*p=*p+1;
控件将*p
的值加1,然后将结果存储在*p
。 它实际上在程序运行时使用了一个您看不到的临时变量。 现在,临时实例的值增加,并最终存储在*p
。 在第二种情况下, *p++;
序列点的概念来了。
根据C标准,对象的存储值只能在两个序列点之间修改一次(通过表达式的计算)。 出现一个序列点:
在*p++;
,因为仅在遇到序列点之后才修改表达式,所以*p
无法存储自身的修改后的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.