发布网友 发布时间:2023-10-27 17:36
共5个回答
热心网友 时间:2024-12-11 16:10
前缀递增递减和*优先级相同,从右到左;
后缀递增递减比前缀优先级高,从左到右。
比如
int arr[5] = { 1,3,5,7,9 };*++p:p先自+,然后*p,最终为3
++*p:先*p,即arr[0]=1,然后再++,最终为2
*p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
(*p)++:先*p,即arr[0]=1,然后1++,该语句执行完毕后arr[0] =2
*(p++):效果等同于*p++
热心网友 时间:2024-12-11 16:11
(*p)++,是先取指针P的值,然后对其值进行++运算,热心网友 时间:2024-12-11 16:11
*(p++):取出指针p所指地址中的数据,指针+1
*p++ : 等同于 *(p++)
(*p)++ : 取出指针p所指地址中的数据,地址中的数据+1
********************************************************
tip1. * 与 ++的优先级相同的,它们的结合性都是自右向左
tip2. ()的优先级高于*和++
****************************************************************
优先级、结合性分析:
*p++ 由(tip1)可知,p先与++结合,再与*结合,
*(p++) 由(tip2)可知,p先与++结合,再与*结合
得出结论:*p++等同于 *(p++)
**********************************************************
变量分析:
*(p++) 由(tip2)可知,是p先与++结合,变量是 p,
得出结论:*(p++) // 是指针所指的地址值在变化 (不同点)
(*p)++ 由(tip2)可知,p先与*结合,得到*p
是*p与++结合,变量是 *p
得出结论:(*p)++ //是指针所指地址中的数据值在变化 (不同点)
********************************************************************
小结:
因为(tip1、tip2)可得出:
1.指针所指地址自增
*p++等同于*(p++)
*++p等同于*(++p)
2.指针所指地址中数据自增
++(*p)等同于++*p
(*p)++
*********************************************************
作为输出项时
(左自增:先求变量变化,再输出)
形式:++p、*++p、++*p、++(*p)、
(右自增:先输出变量当前所指值,再求变量的变化)
形式:p++、*p++、(*p)++、*(p++)
哪个是变量:(在tip1、tip2的基础上)与 ++ 结合的整体是变量
++p : p 是变量、
++(*p): (*p)是变量
***********************************************************
热心网友 时间:2024-12-11 16:12
楼主可以去看看c语言优先级有关的知识。首先*p++等价于*(p++)。至于为什么会等价呢?根据c语言的优先级。*与++的优先级同处在第二级别上。他们的优先级是一样的,又因为处在第二级别的优先级运算符是结合方向是从右到左,所以当出现*p++这样的表达式的时候,根据优先级别相同,并且结合方向是从右到左,所以就等价于*(p++)了。那么也就是,先将p指针移动到下个p指针所指向元素的地址的下一个地址,然后再对那个地址取值。(*p)++是取p所指向地址的值,然后再将这个值+1.这里举个例子,比如热心网友 时间:2024-12-11 16:13
()的优先级高,所以()里面的先执行。另外++的优先级高于*。