自增自减运算
很多编程语言中都涉及到自增自减运算,即 ++、-- 。
以自增运算举例说明:++i 与 i++
- 自增运算分为『前置自增』和『后置自增』,顾名思义,前置自增,『++』符号在变量前,即
++i
,后置自增,『++』符号在变量后,即i++
。 - 前置自增表示
先运算再自增
,即先运算表达式,再执行自增
; - 后置自增表示
先自增再运算
,即先执行自增,再运算表达式的值
。
++i 和 i++ 都可以实现变量 i 本身的加1运算,即 i = i + 1;
。那前置自增和后置自增到底有什么异同呢?
相同点
- 针对变量 i 自身
- 对于 变量 i 自身 来说,无论是前置自增还是后置自增,运算结果都是变量 i 的值加 1 。即经过
i++
或++i
之后,i 的值为i + 1
;
- 针对表达式
- 当表达式仅由变量i和自增运算符组成,而不涉及到别的变量和别的运算,即
i++;
或++i;
,这种情况无论是前置还是后置,都没有区别。都表示i = i + 1;
可以简写为i += 1;
。 - 需要说明一点,为了书写和感官整洁,这种情况习惯上使用“后置自增”,即
i++;
。 例如:
int i = 1;
while (i <= 100)
{
cout << i << ' ';
i++; //这里尽量使用后置自增
}
注意:第1条只针对变量来说,执行完自增之后,结果+1;第2条针对只包含i和自增运算符的表达式,有分号。 注意两种情况的区分。
不同点
- 后置自增表示
先运算表达式,整个表达式运算完成,再将变量i的值+1
。 例如:
int i = 5;
int a = 10;
int sum = 0;
sum = i++ + a;
求:sum的值,i的值
结果:sum 为 15,a 为 6
执行顺序为:
① sum = i + a; => 15 + 10 => 15 //先运算表达式
② i = i + 1; => 5 + 1 => 6 //再自增
- 前置自增表示
变量i的值先+1,改变i的值之后再运算表达式
。 例如:
int i = 5;
int a = 10;
int sum = 0;
sum = ++i + a;
求:sum的值,i的值
结果:sum 为 16,a 为 6
执行顺序为:
① i = i + 1; => 5 + 1 => 6 //先自增
② sum = i + a; => 6 + 10 => 16 //再运算表达式
补充说明
- 自增自减运算符只能用于变量,不能用于常量或表达式。
- 自增自减运算符的结合性是
“自右向左”
。(一般情况下,算术运算符的结合性是“自左向右”) - 自增自减运算符常用语循环语句中,使循环变量(累加器)自动加1操作;也用于指针变量,使指针变量指向下一个内存地址。
小扩展
自增自减虽然语法简便,但可读性差,特别是用在复杂一点的表达式中,会额外增加阅读难度,所以在我们平时的开发中,尽量少用自增自减运算。准确一点说,在比较复杂的表达式中,如果使用自增自减运算,要配合小括号使用增加可读性,或者尽量避免使用。
因为自增(++)自减(--)运算其可读性差,在比较现代的高级程序设计语言中,已经废弃。 如Python、Kotlin中已经不再支持,Swift3.0开始,也已经不再支持。