黑马程序员技术交流社区

标题: (*p)++ 与(*p++) 与 *(p++)问题 [打印本页]

作者: 默默者    时间: 2014-4-28 12:54
标题: (*p)++ 与(*p++) 与 *(p++)问题
请问一下:* 与 ++ 的计算级别 是哪一个高?查了一下好像是同级别的。请给解释一下下面打印的结果
         int *p;
         int num = 5;
         p = #//地址传递
         printf("The address of num is : %p\n",p);//取这个num的内存地址
         printf("The value of num is : %d\n",*p);//取这个num的值
         printf("The *p++ is : %d\n",*p++);
         printf("The (*p)++ is : %d\n",(*p)++);
         printf("The *(p++) is : %d\n",*(p++));
         printf("The (*p)++ is : %d\n",(*p)++);
作者: 兰闻天    时间: 2014-4-28 13:05
本帖最后由 兰闻天 于 2014-4-28 15:01 编辑

         int *p;
         int num = 5;
         p = #//地址传递
         printf("The address of num is : %p\n",p);//取这个num的内存地址 例如0xffff04
         printf("The value of num is : %d\n",*p);//取这个num的值  5
         printf("The *p++ is : %d\n",*p++); //这个先运算的p++,虽然加1了。可返回的值仍然是p原来的值,所以相当于输出的还是*p(num),但运行以后p存的地址值已经修改了
         printf("The (*p)++ is : %d\n",(*p)++);//这个你需要吧前面的注释了。因为上一行已经把p存的地址改了,(*p)相当于5,5++,
         printf("The *(p++) is : %d\n",*(p++));//这个是先找到地址,在地址上加4个字节,查询这个新地址0xffff08的值,因为未定义,所以是个不确定的数
         printf("The (*p)++ is : %d\n",(*p)++);和第四个是一样的吧

作者: 小海    时间: 2014-4-28 18:02
自增与自减的运算符优先顺序要比*高一级,所以先执行++,再执行*
作者: NenKeer    时间: 2014-4-28 22:25
*和++都是单目运算符,单目运算符的运算优先级相同时,是自由向左结合运算的,知道这个了,上面代码应该很容易出答案了
作者: liulinjie    时间: 2014-4-28 22:30
本帖最后由 liulinjie 于 2014-4-28 22:49 编辑

运算符的优先级: *++p 先加加p再取*值, *p++先做*运算再加p. 如果有括号, 先运算括号.
你的例子: (因为p有时会加加, 所以把num写成一个数组来说明比较方便)

         // p是一个整形指针, 所以每次 p+1 都是挪一个int的位置
         int *p;

         // 用一个数组来说明比较方便
         int num[3] = {1, 2, 3};

         // 让 p 指向数组的第一个数字 (或者 p = num)
         p = &num[0];

         // 打印 p 的值,即 num[0] 的地址,是一个16进制数
         printf("The address of num is : %p\n",p);

         // 打印 p 指向的int的值,即 num[0] 的值, 打印结果是 1
         printf("The value of num is : %d\n",*p);

         // *p++: 同等级, 从左往右, 先作*运算, 再把 p 加加
         // 打印的是 *p 的值, 即 num[0] 的值, 打印结果为 1
         // 之后把 p++, p 指向 num[1]
         printf("The *p++ is : %d\n",*p++);

         // (*p)++: 先运算括号, *p 等价于 num[1], 所以这里打印num[1], 再把num[1]加加
         // 打印结果为 2, 之后 num[1] = 3. 此时数组num为 {1, 3, 3}          // 注意 p 并没有加加, 依然指向 num[1]
         printf("The (*p)++ is : %d\n",(*p)++);

         // *(p++): 先运算括号, 括号里是后置加加, 所以先返回 *p, 再把 p++
         // 打印 *p 即 num[1] 的值, 此时 num[1]= 3.  之后 p++, p 指向num[2]
         printf("The *(p++) is : %d\n",*(p++));

         // (*p)++: 先运算括号, *p 等价于 num[2], 所以先打印 num[2], 再把num[2]加加
         // 打印结果为 3, 之后 num[2] = 4. 此时的数组num为 {1, 3, 4}. p 没变, 依然指向 num[2]
         printf("The (*p)++ is : %d\n",(*p)++);





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2