0
#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

4

7 回答 7

1

后自增运算符访问值后递增变量。

因此,得到*ptr2 之后,它ptr会自行增加。

于 2013-06-25T13:59:22.843 回答
1

正如其他人所说,区别在于预递增(在获取值之前发生递增)和后递增(获取值然后发生递增)。当然,应该打印值 2。

也许这个充满断言的代码会有所帮助。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
于 2013-06-25T14:24:08.487 回答
0

不是,因为 ptr++ 在递增之前返回值,所以值为 2。

于 2013-06-25T13:59:02.623 回答
0

*ptr++ 首先取消引用给出 2 的指针,然后递增指针。表达式 *(ptr++) 是一个后递增表达式,因此该表达式的值是 ptr,然后递增。所以表达式的结果是它仍然指向 2

于 2013-06-25T14:00:37.297 回答
0

* 运算符适用于 p++ 的结果,即原始 p 的值(在递增之前)。所以它打印2。我你想3被打印你应该做 (++p) 它返回增加的值。

于 2013-06-25T14:01:07.487 回答
0

*ptr++返回值 at然后ptr递增它,所以在第二个printf()语句中它只返回 2 然后将它递增到 3。

于 2013-06-25T14:01:46.637 回答
0

它应该打印 2,因为后缀运算符 ++ 首先返回该值,然后将其递增。您在其周围添加括号 (*(ptr++)) 的事实不会影响增量。该值将在整行之后递增。

查看反汇编可能会帮助您了解该行发生了什么。

于 2013-06-25T14:05:41.180 回答