#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.为什么会这样?...
答案 0 :(得分:1)
撰写*p++
时,您将获得以下操作:
p++
(稍后p将增加)p
的原始值(因为这是后缀++
,如果它是前缀,则返回的值将为p + 1 ...)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标准,对象的存储值只能在两个序列点之间修改一次(通过表达式的评估)。 出现一个序列点:
在*p++;
中,由于仅在遇到序列点后才修改表达式,*p
无法存储其自身的修改值。