递增运算符(increment operator)将其运算对象递增1。该运算符以两种方式出现:
++
出现在其作用的变量前面,这是前缀模式++
出现在其作用的变量后面,这是后缀模式两种模式的区别在于递增行为发生的时间不同,前缀模式下先进行自增操作,而后缀模式后进行自增操作,如下的程序解释了前缀模式:
shoe = 2.0;
while (++shoe < 18.5)
{
foot = SCALE*shoe + ADJUST;
printf("%10.1f %20.2f inches\n", shoe, foot);
}
在while语句中,shoe 的值先递增1,然后才和18.5作比较。如果递增后的值小于18.5,则执行花括号内的语句一次。然后, shoe的值再递增1,重复刚才的步骤,直到shoe的值不小于18.5为止。整个过程如图5.4所示:
递增运算符的一个优点是,通常它生成的机器语言代码效率更高,因为它和实际的机器语言指令很相似。尽管如此,随着商家推出的C编译器越来越智能,这一优势可能会消失。一个智能的编译器可以把x=x+1
当作++x
对待。
递增运算符还有一个在某些场合特别有用的特性。我们通过程序清单5.11来说明。
程序5.11
/* post_pre.c -- postfix vs prefix */
#include
int main(void){
int a = 1, b = 1;
int a_post, pre_b;
a_post = a++; // value of a++ during assignment phase
pre_b = ++b; // value of ++b during assignment phase
printf("a a_post b pre_b \n");
printf("%1d %5d %5d %5d\n", a, a_post, b, pre_b);
return 0;
}
编译后程序的输出应该是:
a a_post b pre_b
2 1 2 2
可以看出,当运算符和运算对象是更复杂表达式的一部分时,使用前缀或后缀的效果不同:a_ post是a递增之前的值,而b_ pre是b递增之后的值,整个过程如图5.5所示:
单独使用递增运算符时(如,ego++; ),使用哪种形式都没关系。
待补充 138