其他分享
首页 > 其他分享> > *a++的含义及C语言中的左值(Lvalues)和右值(Rvalues)

*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)++,都是错误的

标签:右值,++,左值,执行,自加,赋值
来源: https://blog.csdn.net/a921218316/article/details/111058564