论文部分内容阅读
摘要: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。
关键词: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。