c语言中的自增运算和指针的优先级问题

阿弥陀佛,工作以后又回来补这些知识了,果然时间久了就容易忘,记录在这里以后好翻阅:

首先来看看一个比较简单的自增运算的例子:

a=i++;

b=++i;

相信这个大家都比较清楚吧

对于 a来说,先赋值i的值给a,然后i自己加1;

对于b来说,i自己先加1,然后赋值给b;

好了,来背口诀,i++先赋值再运算;++i先运算再赋值;

上面这个例子比较简单,只含有自增运算的表达式,但当自增运算符和指针结合在一起时,我们就可能有点懵了

举例如下:

    int a[]={1,2,3,4,5,6,7};
    int *p=a;  //此时*p=1; 即指向数组a的首地址

q=*p++;   //等价于 q=*p; p++;

q=*(p++);   //等价于 q=*p; p++;

以上对q的两个赋值运算操作结果是一样的;为啥??

*和++的优先级是相同的,运算符的结合都是自右向左的,因此 ++只对 p 产生作用,而不是*p,再结合我们的口诀,i++先赋值再运算

而对于 q=*++p   //p地址先加1  然后再取p地址的值

同理 对于 ++i 是先运算  再赋值,实在不能理解,拿下面这段代码一运行就知道了:

#include<stdio.h>

int main(){
	//int a[]={1,2,3,4,5,6,7};
	//int *p=a;
	
	//printf("%d\n",*p);

	//printf("%d\n",*p++);
	//printf("%d\n",*(p++));

	//printf("%d\n",*++p);
	//printf("%d\n",(*p)++);
	//printf("%d\n",++*p);

	
	int i=1;
	int a=i++;
	
	printf("a=%d\n",a);
	printf("i=%d\n",i);
	
	int a1=2*(i++);
	
	printf("a1=%d\n",a1);
	printf("i1=%d\n",i);
	
	
	int a2=2*(++i);
	printf("a2=%d\n",a2);
	printf("i2=%d\n",i);
	

}

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值