#include <stdio.h>
int main(void)
{
int i;
int *p = (int *) malloc(5 * sizeof(int));
for (i=0; i<10; i++)
*(p + i) = i;
printf("%d ", *p++);
return 0;
}
所以,我运行了这段代码。现在我被告知Why won't the output be 4 in this case?(在接受的答案中)*p++
将首先递增指针然后取消引用它。因此,在上面的代码中,指针不应该首先递增然后取消引用,因此输出应该是1
?相反,输出结果为0
。为什么呢?
答案 0 :(得分:4)
你的优先顺序是正确的,但是让我们看一下postfix增量运算符属性,不管吗?
C11
标准在章节§6.5.2.4中说明, Postfix递增和递减运算符
后缀
++
运算符的结果是操作数的值。作为副作用,操作数对象的值递增(即,值1适当的类型添加到它)。 [...]
因此,变量本身将体验增量的效果,但变量存在的语句(带有后缀增量)将利用现有的变量的值,而不是递增的值。增量将在稍后部分作为副作用执行。
答案 1 :(得分:3)
本声明
printf("%d ", *ptr++);
执行以下操作:
ptr
,产生ptr[0]
int
步骤1的评估结果为ptr[0]
ptr
,使其指向ptr[1]
打印ptr[1]
使用:
printf("%d ", *++ptr);
答案 2 :(得分:1)
请注意,它是后增量。因此,后缀++
运算符的返回值是操作数本身的值,然后作为副作用,操作数对象的值递增。
表达式*ptr++
将是
*ptr
*ptr
的值用作printf("%d ", *ptr);
ptr = ptr + 1
这些表达式的输出可以通过以下方式理解:
- 前缀++ 和
*
的优先顺序相同。两者的相关性是从右到左。- 后缀++的优先级高于
醇>*
和前缀++ 。 后缀++ 的相关性为从左到右。因此,在上面的代码中,不应该首先递增指针然后取消引用,因此输出应该是1?
使用以下要求:
printf("%d ", *++ptr);
答案 3 :(得分:0)
首先,您应该添加#include <stdlib.h>
。其次,您应该更正代码int *p = (int *) malloc(10 * sizeof(int));
。然后*p++
代表1. printf *p; 2. p++
。如果要获得值1,则应使用代码printf("%d ", *++p);
。我希望这可以帮到你。