解析C语言中自增自减运算符

时间:2022-07-07 09:26:30

解析C语言中自增自减运算符

摘要:C语言中自增自减运算符的运算规则是比较灵活的,它在不同的表达式或不同的位置上的运算规则都有所区别。该文从3个方面及10个典型实例剖析了自增自减运算符的运算规律。

关键词:C语言;自增自减运算符;优先级;前缀自增(减);后缀自增(减)

中图分类号:TP312文献标识码:A文章编号:1009-3044(2010)17-4671-03

C语言是计算机专业重要的基础课程,由于C语言简洁、灵活、运算符丰富,功能强大,而深受广大计算机应用人员的喜爱,也正因为它的灵活多变,故不易掌握。C程序设计语言中有大量的运算符,其中的自增运算符++和自减运算符--是C语言有的两个运算符、自增、自减运算符在C程序中是十分常见的,也是全国计算机等级等各类考试中常见题目,尤其是自增自减表达式的结果,往往让初学者摸不着头脑,但是如果没有透彻掌握这两个运算符的含义及运算实质,使用时可能会使整个程序结果事与愿违。本文以win-tc为运行环境,浅析自增自减运算符在不同环境下的运行规律。

1 自增++自减--运算符的运算规则

在C语言程序设计中,自增运算符为“++”及自减运算符“--”是非常常用的算术运算,也是比较特殊的两种运算符, 它们的作用分别是使变量的值增加1和减少1,结果均保存在原变量中,其功能相当于加、减表达式的简写形式,例如i++相当于表达式i=i+1,--i相当于i=i-1。它是一个单目运算符,只能作用于变量进行运算,而不能用于常量或表达式,该变量通常是整型或者是字符型。如a++或b--都是合法的,而3++或(a+b)++都是不合法的。由于自增运算符是在表示在原来变量的基础上自加1,最后的结果还是保存在原来的变量中,假如是常量,常量的值不能改变,无法自加1,不符合逻辑要求;若是表达式,如(a+b)++,假如a+b=10,自增后的值11又不知保存到那个内存空间去,无变量空间可供存放,所以是非法的表达式。

自增运算符“++”与自减运算符“-”既可以写在变量名的前面,也可以写在变量名的后面,分别称为前缀自增(减)和后缀自增(减)。

1) ++i(前缀自增) 变量i先自增1,然后再使用i的值

--i(前缀自减) 变量i先自减1,然后再使用i的值

2) i++(后缀自增) 先使用变量i的值,然后i再自增1

i--(后缀自减) 先使用变量i的值,然后i再自减1

当自增表达式或自减表达式作为单一的语句出现时,两者没有区别。

以下以自增表达式为例,自减表达式的原理类似,这里就不再累述。

例如,以下两个例子代码是等价的。

例1:

main()

{int x=5; x++; printf("%d",x);getch();}

/* 结果输出x的值为6 */

例2:

main()

{int x=5; ++x; printf("%d",x); getch();}

/* 结果输出x的值为6 */

但如果自增运算符或自减运算符出现在表达式中,则两者的运算结果会有所区别。例如:

例3:

main()

{int x=5; y=x++; printf("%d,%d",x,y); getch(); }

/* 先把x的值5赋给变量y,然后x再自增1,结果输出x的值为6,y的值为5 */

例4:

main()

{ int x=5; y=++x; printf("%d,%d",x,y); getch(); }

/* 先x的值自增1,变为6,然后把6赋给变量y, 结果输出x的值为6,y的值也为6 */

由以上例子知道,当自增运算符和自减运算符出现在表达式中,就得特别注意他们所处的位置,是在变量之前还是在变量之后,其运算顺序有所不同,结果也不同。

2 自增(自减)运算符与加减运算符间的混合运算规则

自增(自减)运算符与加减运算符进行混合运算,在算术表达式中的情况比较常见的,但也是比较容易出问题的。例如:

例5:

main()

{ int x=5,y;

y=-x++;

printf("%d,%d",x,y);

getch();

}

这个例子中y=-x++表达式,是将表达式理解为y=(-x)++,还是理解为y=-(x++)呢?要解决这个问题,就得从运算符的优先级及结合方向来考虑,自增”++”、取反”-“运算符优先级都是第2级,结合方向都是从右向左,按照C语言的规定,相同优先级运算符的运算先后次序由结合方向来决定,由于两个运算符都是右结合性,所以表达式应该理解为y=-(x++),从而得出最后结果:x的值为6,y的值为-5。

例6:

main()

{ int x=5,y;

y=x+++x+++x;

printf("%d,%d",x,y);

getch();

}

要得出x,y的值,首先要搞清+++运算符的含义。由于C语言编译器在处理自增运算符在算术表达式中的运算规则是:从左至右尽可能多的将若干个字符组成一个有意义的运算符,如i+++j,等价于(i++)+j,因此y=x+++x+++x表达式C编译器将其处理为y=(x++)+(x++)+x,而不是y=x+(++x)+(++x)。

接下来是计算y=(x++)+(x++)+x表达式的值,那么,它们的值到底是多少呢? y=5+6+7=18 还是y=5+5+5=15呢?

C语言在计算一个表达式时,如果表达式含有对于整型变量自增运算符,则首先执行所有的前缀自增操作,然后让变量参加算术运算,得到表达式的结果,最后再执行后缀增量操作,最终确定变量的值。因此y=(x++)+(x++)+x表达式的计算过程如下:

1) 由于没有前缀自增量操作,所以先取x的值5计算表达式的值:y=5+5+5=15。

2) 然后再执行后缀自增量运算,该表达式中有两个后缀自增量操作,则执行后x=7。

由此可见,例6代码执行后x的值为7,y的值15。

例7:

main()

{ int x=5,y;

y=++x+(++x)+x++;

printf("%d,%d",x,y);

getch();

}

分析:依照例6的分析,y=++x+(++x)+ x++表达式C语言编译器将其处理为y=(++x)+(++x)+(x++),整个表达式的计算过程如下:

1) 首先执行前缀自增量操作,在表达式中有两个前缀自增变量,经过这两个前缀自增量后,x=7。

2) 然后再取x的值7计算表达式的值:y=7+7+7=21。

3) 最后再执行后缀自增量运算,该表达式中有一个后缀自增量操作,则执行后x=8。

因此,例7代码执行后x=8,y=21。

例8:

main()

{ int x=5,y;

y=++x+(++x)+(++x);

printf("%d,%d",x,y);

getch();

}

分析:依照例6的分析,y=++x+(++x)+(++x)表达式C语言编译器将其处理为y=(++x)+(++x)+(++x),根据C语言在计算表达式的规则,整个表达式的计算过程如下:

4) 首先执行前缀自增量操作,在表达式中有三个前缀自增变量,经过这三个前缀自增量后,x=8。

上一篇:基于数学形态学的图像边缘检测研究 下一篇:拓扑排序算法对排课方案判定的应用