*a++的含义及C语言中的左值(Lvalues)和右值(Rvalues)

1、 *和++哪个优先级更高?

      两个处于同一优先级,编译器结合方向是自右向左,所以*a++可看成*(a++),即先执行a++,后执行*a。但由于这里的“++”号是后加加号,所以会在整条语句执行完后再对a自加一。所以最终的实际执行效果等效为:先执行(*a)操作,后a自加。*a++可看成*(a++),即先执行a++,后执行*a。但由于这里的“++”号是后加加号,所以会在整条语句执行完后再对P自加一。所以最终的实际执行效果等效为:先执行(*a)操作,后a自加。

2、*a++和(*a)++的区别

一个是 指针后移 一个是指针指向的内容自加

3、举例

int *a, b[2]={2,1},c;
a = b;
c=*a++ 那么 a 指向b[0] 则c=b[0]=2,执行完后a++,这时a 指向b[1]
c=(*a)++ 那么 c =b[1]=2

 

 

注意:在编译器中单独的“  *a++ ;”或者“(*a)++”,编译器是会报错的,想实现指针后移 ,应int*a;a++;那么为什么编译器会报错呢?这里就会牵涉到C语言中的左值(Lvalues)和右值(Rvalues)问题。

 

 

C 中有两种类型的表达式:

  1. 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
  2. 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。*a就是指向储在内存中某些地址的数值,所以*a++ 即*a=*a(++),(*a)++=(*a)++,都是错误的

  • 13
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值