#include <stdio.h>
#include <stdlib.h>
int main()
{
int k,*ptr=NULL;
int arr[]={1,2,3,4,5,6,7,8,9,10};
ptr=arr;
printf("%d ",*ptr++);
printf("%d ",*(ptr++));
printf("%d ",(*ptr)++);
printf("%d ",*++ptr);
printf("%d ",++*ptr);
}
为什么第二个printf
会打印数字2
?它应该打印3
。
答案 0 :(得分:1)
post increment operator在访问该值后递增变量
因此, 获得*ptr
后,ptr
会增加{{1}}。
答案 1 :(得分:1)
正如其他人所说的那样,区别在于预递增(在取值之前增量发生)和后递增(取值之后然后发生增量)。当然应该打印出值2.
也许这个含有断言的代码会有所帮助。如果在执行时指定的条件为false,则assert()
宏将停止程序。断言不会触发。
断言显示ptr
的值如何变化,以及数组中的值如何变化。
#include <assert.h>
#include <stdio.h>
int main(void)
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int *ptr = arr;
assert(ptr == &arr[0]);
printf("%d\n",*ptr++); // print 1; ptr = &arr[1]
assert(ptr == &arr[1]);
printf("%d\n",*(ptr++)); // print 2; ptr = &arr[2]
assert(ptr == &arr[2]);
assert(*ptr == 3);
printf("%d\n",(*ptr)++); // print 3; ptr = &arr[2]; arr[2] = 4
assert(ptr == &arr[2]);
assert(*ptr == 4);
printf("%d\n",*++ptr); // print 4; ptr = &arr[3]
assert(ptr == &arr[3]);
assert(*ptr == 4);
printf("%d\n",++*ptr); // print 5; ptr = &arr[3]; arr[3] = 5
assert(ptr == &arr[3]);
assert(*ptr == 5);
printf("Offset: %d\n", (int)(ptr - arr));
for (int i = 0; i < 9; i++)
printf("a[%d] = %d\n", i, arr[i]);
return 0;
}
输出:
1
2
3
4
5
Offset: 3
a[0] = 1
a[1] = 2
a[2] = 4
a[3] = 5
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9
答案 2 :(得分:0)
不是,因为ptr ++在递增之前返回值,所以值为2.
答案 3 :(得分:0)
* ptr ++首先取消引用给出2的指针,然后递增指针 表达式*(ptr ++)是一个后增量表达式,因此该表达式的值为ptr,然后递增。所以表达式的结果是它仍然指向2
答案 4 :(得分:0)
*运算符适用于p ++的结果,这是原始p的值(在增量之前)。所以它会打印2
。我想要打印3
你应该做(++ p),它会返回递增的值。
答案 5 :(得分:0)
*ptr++
返回ptr
处的值,然后递增它,因此在第二个printf()
语句中,它只返回2,然后将其递增为3。
答案 6 :(得分:0)
它应该打印2,因为后缀运算符++首先返回该值然后递增它。 你在它周围添加括号(*(ptr ++))的事实不会影响增量。 该值将在整行之后递增。
查看反汇编可能会帮助您了解该行发生的情况。