hanviry 发表于 2019-8-18 23:46:29

关于C语言指针自加自减问题

上代码:

#include <stdio.h>

int main()
{
    int arr[] = {11,12,13,14,15};
    int *ptr = arr;
    *(ptr++) += 100;
    printf("%d %d\n",*ptr,*(++ptr));
   
    return 0;
}


答案运行结果是13,13

但我理解的是,先操作数组0位置,再指向1位置,打印1位置和2位置(先自加,指向下一位置再取值)

求助,谢谢了!

Seawolf 发表于 2019-8-19 01:21:56

答案应该是12和13,*(ptr++) += 100; increment ptr 一次,*(++ptr) 先increment 再取值

Python.爱好者 发表于 2019-8-19 08:13:47

本帖最后由 Python.爱好者 于 2019-8-19 08:15 编辑

#include <stdio.h>

int main()
{
    int arr[] = {11,12,13,14,15};
    int *ptr = arr;
    *(ptr++) += 100;
    printf("%d %d\n",*ptr,*(++ptr));
   
    return 0;
}
这段代码存在误导性的一点在于printf函数。
printf函数的原型是
int __cdecl printf(const char * __restrict__ _Format,...);
注意__cdecl:
__cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。——百度百科
因此,我的理解是,(1)*(++ptr)入栈,ptr更新为arr+2,对应的数是13。(2)接下来*ptr入栈,对应的数依然是13。
证据是把*(++ptr)替换为*(ptr++)输出13 12。
而把printf的参数交换位置时输出12 13。
最后把printf这句话替换为
int p,pp;
        p=*ptr,pp=*(++ptr);
    printf("%d %d",p,pp);


int p=*ptr,pp=*(++ptr);
    printf("%d %d",p,pp);
时输出12 13,因为逗号运算符以及变量的定义是从左到右进行计算的。
所有代码均为本人在dev-c++上测试。

hanviry 发表于 2019-8-19 10:40:22

Python.爱好者 发表于 2019-8-19 08:13
这段代码存在误导性的一点在于printf函数。
printf函数的原型是
int __cdecl printf(const char * __re ...

额嗯大概明白,还有就是上面这个:
*(ptr++) += 100;

是*(ptr++)= *(ptr++)+100的意思吗?
那指针是自增一次还是两次啊

Python.爱好者 发表于 2019-8-19 16:19:08

hanviry 发表于 2019-8-19 10:40
额嗯大概明白,还有就是上面这个:
*(ptr++) += 100;



不是,要按照运算符优先级进行计算
初始时 ptr=arr
接下来*(ptr++) += 100;
括号优先级最高,执行ptr++,实际返回ptr
*(ptr)就是arr即12。
最后计算arr+=100,12+100=112。
因此指针是自加一次。
————————————
a+=b等价于a=a+b,但是要先按照运算符优先级的规则算出a与b才能进行计算。

hanviry 发表于 2019-8-19 20:50:54

Python.爱好者 发表于 2019-8-19 16:19
不是,要按照运算符优先级进行计算
初始时 ptr=arr
接下来*(ptr++) += 100;


嗯明白了,谢谢啦
页: [1]
查看完整版本: 关于C语言指针自加自减问题