当前位置:C++技术网 > 资讯 > C++中解引用与自增同时出现,先自增还是先解引用

C++中解引用与自增同时出现,先自增还是先解引用

更新时间:2016-07-05 13:31:01浏览次数:1+次

  当自增自减操作单独出现时,无论是前自增(自减)还是后自增(自减),其运算结果是一样的。而很多有经验的程序员,为了代码的简洁,往往习惯于把自增自减操作与其他运算结写在一条语句中,对于初学者来说,读这类代码会有些吃力。

  前自增和后自增的区别主要体现在它们与其他运算结合时,先做自增还是先做其他运算。如下面的运算,

int a,b,i = 5, j = 5;
a = i++ + i++;
b = ++j + ++j;

 大家都知道ab的值是不相同的,但是很可能会把计算过程理解错,ab的计算过程如下,

 对于a的计算

正确的理解是:
  i=5;
 a=i+i; //此时的计算为a=5+5;
  i++;
  i++;  
而不是:
 i=5;
 temp = i;
 i++;
 a = temp + I; // a=5+6;
 i++;

  这两种理解方式,i最后的值是一样的,但是a的值是不同的。第一种方式的理解是正确的,虽然后自增操作符“++”的优先级是高于“+“的,但在a的加法运算中,两个i都是未自增前的值。也就是,后自增操作返回其操作数原值(未自增)的副本。

 对于b的计算,

正确的理解是:
  j = 5;
  ++j;  //j=6;
  ++j;  //j=7;
  b = j+j;  //b=7+7;
而不是:
  j = 5;
  ++j; //j=6;
 temp = j;
 ++j; //j=7;
 b = temp + j;  //b=6+7;

 同样,在这两种理解方式下,j最后的值是一致的,而b的值是不同的。

解引用与自增运算结合使用,

对于前自增很容易理解,
 int b[5]={20,30,40,50,60};
 int *p=b;  //p指向数组的第一个元素
 //用指针输出数组的下一个元素
 printf("%d\n",*++p);

 这里的*++p等价于*(++p),对p指向的下一个位置解引用。
而对于后自增,
int *p=b;  //p指向数组的第一个元素
printf("%d\n",*p++);
printf("%d\n",*p);

  这里的*p++等价于*(p++),后自增运算符++优先级高于解引用操作符*,按照这种优先级运算顺序,上面第一条输出语句打印的应该是数组b的第二个元素,而实际上打印的是第一个元素。这是因为,虽然*p++等价于*(p++),但解引用操作*的操作数是p未自增前的副本。第二条输出语句打印的是数组b的第二个元素,此时p指向数组的第二个位置。