C语⾔i++与++i的主要区别
i++ 与 ++i 的主要区别有两个:
1、 i++ 返回原来的值,++i 返回加1后的值。
2、 i++ 不能作为左值,⽽++i 可以。
毫⽆疑问⼤家都知道第⼀点(不清楚的看下下⾯的实现代码就了然了),我们重点说下第⼆点。
⾸先解释下什么是左值(以下两段引⽤⾃中⽂『右值引⽤』词条)。
左值是对应内存中有确定存储地址的对象的表达式的值,⽽右值是所有不是左值的表达式的值。
⼀般来说,左值是可以放到赋值符号左边的变量。但
能否被赋值不是区分左值与右值的依据。⽐如,C++的const左值是不可赋值的;⽽作为临时对象的右值可能允许被赋值。左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
⽐如,
int i = 0;
int *p1 = &(++i); //正确
int *p2 = &(i++); //错误
++i = 1; //正确
i++ = 5; //错误
那么为什么『i++ 不能作为左值,⽽++i 可以』?
看它们各⾃的实现就⼀⽬了然了:
// 前缀形式:
int& int::operator++() //这⾥返回的是⼀个引⽤形式,就是说函数返回值也可以作为⼀个左值使⽤
{//函数本⾝⽆参,意味着是在⾃⾝空间内增加1的
*this += 1;  // 增加
return *this;  // 取回值
}
//后缀形式:
const int int::operator++(int) //函数返回值是⼀个⾮左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
int oldValue = *this;  // 取回值
++(*this);  // 增加
return oldValue;  // 返回被取回的值
}
如上所⽰,i++ 最后返回的是⼀个临时变量,⽽临时变量是右值。
来⼀道例题
#include<stdio.h>
c语言和c++区别
int main(){
int i=0,j=0;
while(i<10){
i++;
}
while(j++<10);
printf("i=%d,j=%d\n",i,j);
return0;
}
i=10,j=11

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。