------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。变量i被称为“计数器”,用来记录完成某一操作的次数。C语言为这种计数器操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是从右向左结合的一元算术运算符,优先级为2。学习和应用这两个运算符时应注意以下几点:
1.注意区分表达式的值和变量的值
以自增运算符为例,当自增运算符++作用于一个变量时,例如:当i=1时++i相当于i=i+1,这个算术表达式的值为2,同时变量i的值也由原来的1改变为2。一般情况下,计算表达式后不改变变量本身的值,而++运算符和--运算符组成的表达式计算后,则改变变量的值,这称为运算符的副作用。这类运算符在计算表达式时,一定要注意区分表达式的值和变量的值。
2.注意前缀运算和后缀运算的区别
仍以自增运算符为例,该运算符可作用在变量之前,例如前面所讲的++i,称为前缀运算;也可作用在变量之后,例如i++,称为后缀运算。在这两种运算中,表达式的值不同:前缀运算后,表达式的值为原变量值加1;后缀运算后,表达式的值仍为原变量值;而变量值不论前缀运算还是后缀运算都加1。自减运算符与自增运算符类似,只要将加1改为减1即可。
#include<stdio.h> int main(){ int i = 1,j = 1; int a = 0, b = 0; a = i++; b = ++j; printf("i = %d\n",i); printf("j = %d\n",j); printf("a = %d\n",a); printf("b = %d\n",b); return 0; }
上面的程序在Xcode中运行后打印出的结果为i = 2,j = 2,a = 1,b = 2,变量i在经过后缀运算后值为2,变量j经过前缀运算后的值为2,而表达式a的值为1,b的值为2,因此无论前缀运算还是后缀运算变量的值都会加1,而后缀表达式的值不变,前缀表达式的值也加1,即前缀运算是“先变后用”,而后缀运算是“先用后变”。自减运算与自增运算同理,也是前缀运算“先变后用”,而后缀运算“先用后变”。
3.注意运算符的运算对象
自增、自减运算符只能作用于变量,而不能作用于常量或表达式。因为自增、自减运算符具有对运算量重新赋值的功能,而常量、表达式无存储单元可言,当然不能做自增、自减运算。只要是标准类型的变量,不管是整型、实型,还是字符型、枚举型都可以作为这两个运算符的运算对象。
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语言允许在一个表达式中使用一个以上的赋值类运算,包括赋值运算符、自增运算符、自减运算符等。这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。
克服这类副作用的方法是,尽量把程序写得易懂一些,即将费解处分解成若干个语句。如:
sum+=num++;
可写成
sum+=num;
num++;
而类似(i++)+(i++)+(i++)这类连续自增、自减的运算最好不要使用,以避免疑团的出现,同时也可减少程序出错的可能性。
在程序设计中,效率和易读性是一对主要矛盾。为了提高程序的效率,需要用技巧把程序写得尽可能简洁一些,但这样有可能降低程序的可读性和可理解性。可读性差的程序容易隐藏错误且难于纠正,不易维护,降低了程序的可靠性。鉴于“软件危机”的教训,人们在程序设计时遵守的基本规范是:可靠性第一,效率第二。为了保证可靠性,程序必须清晰易读,而表达式的清晰易读是十分重要的方面。因此,在C程序设计中,要慎重使用自增、自减运算符,特别是在一个表达式中不要多处出现变量的自增、自减等运算。