开云「中国内陆」官方网站 更高效、更智能、更环保
你的位置:开云「中国内陆」官方网站 更高效、更智能、更环保 > 新闻资讯 >
发布日期:2026-02-20 09:55 点击次数:143

自增自减范例
i++ 与 ++i 的主要区别有两个:
1、 i++ 复返本来的值,++i 复返加1后的值。
2、 i++ 弗成行动左值,而++i 不错。
毫无疑问大家齐知说念第少量(不明晰的看下底下的达成代码就了然了),咱们重心说劣等二点。
率先讲授下什么是左值(以下两段援用自中语维基百科『右值援用』词条)。
左值是对应内存中有笃定存储地址的对象的抒发式的值,而右值是系数不是左值的抒发式的值。
一般来说,左值是不错放到赋值象征左边的变量。但
能否被赋值不是分裂左值与右值的依据。比如,C++的const左值是不可赋值的;而行动临时对象的右值可能允许被赋值。左值与右值的根底区别在于是否允许取地址&运算符赢得对应的内存地址。
比如,
张开剩余79%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++ 终末复返的是一个临时变量,而临时变量是右值。
运算符读取范例
C言语关于处分这个问题的处分决策不错归纳为一个很简便的范例:每一个象征应该包含尽可能多的字符。也等于说,编译器将法子证据成象征的情景是:从左到右一个一个字符的读入,字符一个字符地读入,要是该字符可能构成一个象征,那么再读入下一个字符,判断依然读入的两个字符构成的字符串是否可能是一个象征的构成部分;要是可能,连续读入下一个字符,雷同上述判断,直到读入的字符构成的字符串已不再可能构成一个有真义的象征。这个处理计谋偶然被称为“无餍法”,概况,更白话化少量,称为“大嘴法”,Kernighan与Ritchie对这个情景的表述如下,“要是(编译器的)输入流戒指至某个字符之前齐依然被证据为一个个象征,那么下一个号将包括从该字符之后可能构成一个象征的最长字符串。”
---《C陷坑和颓势》 第八页
编译器编译情况
自增(后缀):
Turbo C中,先结伙取值后程序自增;
VS中,从左向右程序取值自增;
int a,i=5;
a=i+++i+++i++;
//按照贪默算法,成果为(i++)+(i++)+(i++)
//Turbo C中:a=5+5+55=15,i=8
//VS中:a=5+6+7=18,i=8
以下编译出错
int a,i=5;
a=++i+++i+++i;
//编译不实
//编译器编译后,((++i)++)+(i++)+i
++i复返的是一个援用体式,无法在对(++i)在进行自增。
发布于:湖南省Powered by 开云「中国内陆」官方网站 更高效、更智能、更环保 @2013-2022 RSS地图 HTML地图