c++自增自减运算汇总(经典)

c++自增自減問題

 在程序设计中,经常遇到i=i+1i=i-1这两种极为常用的操作。变量i被称为计数器,用来记录完成某一操作的次数。C语言为这种计数器操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是从右向左结合的一元算术运算符,优先级为2。学习和应用这两个运算符时应注意以下几点:
1 注意表达式的值和变量值的区别
  以自增运算符为例,当自增运算符++作用于一个变量时,例如:当i=3时++i这个算术表达式的值为4,同时变量i的值也由原来的3改变为4。一般情况下,计算表达式后不改变变量本身的值,而++运算符和--运算符组成的表达式计算后,则改变变量的值,这称为运算符的副作用。这类运算符在计算表达式时,一定要注意区分表达式的值和变量的值。
2 注意前缀运算和后缀运算的区别

  仍以自增运算符为例,该运算符可作用在变量之前,例如前面所讲的++i,称为前缀运算;也可作用在变量之后,例如i++,称为后缀运算。在这两种运算中,表达式的值不同:前缀运算后,表达式的值为原变量值加1;后缀运算后,表达式的值仍为原变量值;而变量值不论前缀运算还是后缀运算都加1自减运算符与自增运算符类似,只要将加1改为减1即可。即前缀运算是先变后用,而后缀运算是先用后变
3 注意运算符的运算对象

自增、自减运算符只能作用于变量,而不能作用于常量或表达式。因为自增、自减运算符具有对运算量重新赋值的功能,而常量、表达式无存储单元可言,当然不能做自增、自减运算。只要是标准类型的变量,不管是整型、实型,还是字符型、枚举型都可以作为这两个运算符的运算对象。如以下四个表达式都是合法的:i+++j++、++i+(++j)、++a+b++、++array[--j];而++6、(i+j)++、A++、++i+++j、(&p)++这五个表达式却是不合法的。为什么i+++j++合法,而++i+++j却不合法?C的编译器对程序编译时,从左到右尽可能多地将字符组合成一个运算符或标识符,因此i+++j++等效于(i++)+(j++),两个++作用的对象都是变量,这是合法的;而++i+++j等效于++(i++)+j,第1个++作用的对象是表达式i++这是不允许的。
4 注意运算符的结合方向

  表达式k=-i++等效于k=(-i)++还是k=-(i++)?因为负号运算符和自增运算符优先级相同,哪一个正确就得看结合方向。自增、自减运算符及负号运算符的结合方向是从右向左。因此,上式等效于k=-(i++)若i=5,则表达式k=-i++运算之后k的值为-5,i的值为6。此赋值表达式的值即为所赋的值-5。不要因为k=-i++等效于k=-(i++)就先做++运算!这里采用的是先用后变,即先拿出i的值做负号-运算,把这个值赋给变量k之后变量i才自增。
5 注意运算符的副作用

  C语言允许在一个表达式中使用一个以上的赋值类运算,包括赋值运算符、自增运算符、自减运算符等。这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一:有的认为是9(3+3+3,如谭浩强的《C程序设计》,清华大学出版社,1991);也有的认为是12(3+4+5,如王森的《C语言程序设计》,电子工业出版社,1995)。到底哪一个说法正确呢?究其原因,先用后变,先变后用中的是一个模糊的概念,很难给出顺序或时间上的准确定论。到什么时候,到什么程度?没有此方面的详细资料可供查询。
  为此,笔者用各种表达式上机测试,给出VC++环境下连续自增(自减)运算规则:

1、 在一般表达式中和在函数参数中计算的结果相同(这一点与TurboC环境不同);

2、 后缀:同表达式中Turbo C的情况相同:先统一取值后依次自增,如:

int a,i=5; a=i+++i+++i++;a=15, i=8.

3、 前缀:前两个自增同Turbo C,即依次自增后统一取值,后面的每个自增后即

取值,如:

int a, i=5; a= ++i+(++i)+(++i); a=22, i=8.

4、 前后缀混合的情况:

(1) 一般情况:表达式中自左向右计算,参数自右向左运算。前缀自增后取值;后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增在语句结束前进行。

(2) 前后缀各有一个的情况:设int i=5; 由于i++*++i应满足交换率与++i*i++相同,规定按后者计算故为36。实验2内容4:int i=5;printf("%d,%d\n", --i, i++*++i ); 打印5,36。

(3) 若i++或++i或两者有多于一个的情况:++i有两个以上在一起时最左边的连续自增同3、,其余每个自增后取值,如:int i=5;

printf("%d\n%d\n",--i,(++i)+(i++)+(i++)+(++i));打印6和25

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+(++i)+(i++));打印8和40

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+i+(++i)+(++i)); 打印9和49

(4) 函数参数中有括号时,括号参数优先计算,其余参数仍自右向左计算,如:

int i=9,j=8;printf("%d %d\n", (++i, j--), ++i); 打印8 11

printf("%d %d%d\n", (++i, j--), ++i, i); 打印8 11 10

(5) 最后i的值等于原值加总自增次数减自减的次数.

  克服这类副作用的方法是,尽量把程序写得易懂一些,即将费解处分解成若干个语句。如:k=i+++j:可写成k=i+j:i++:而类似(i++)+(i++)+(i++)这类连续自增、自减的运算最好不要使用,以避免疑团的出现,同时也可减少程序出错的可性能。
  在程序设计中,效率和易读性是一对主要矛盾。为了提高程序的效率,需要用技巧把程序写得尽可能简洁一些,但这样有可能降低程序的可读性和可理解性。可读性差的程序容易隐藏错误且难于纠正,不易维护,降低了程序的可靠性。鉴于软件危机的教训,人们在程序设计时遵守的基本规范是:可靠性第一,效率第二。为了保证可靠性,程序必须清晰易读,而表达式的清晰易读是十分重要的方面。因此,在C程序设计中,要慎重使用自增、自减运算符,特别是在一个表达式中不要多处出现变量的自增、自减等运算。


  • 23
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值