C语言中自增自减运算符教学探究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中自增自减运算符教学探究
摘要:C语言教学中,自增自减运算符运用得非常广泛,且具有一定的使用技巧和难度。在诸多运算符中,自增自减运算符是学生最难理解和最易出错的运算符。对自增自减运算符的功能和具体应用进行探究,以期为提高C语言教学效果提供帮助。
关键词:C语言;自增自减运算符;教学效果0引言
C语言编程设计中,若合理使用自增自减运算符,则可以节省代码,提高效率;若不能正确理解和掌握,则容易造成错误,这往往让学生初学时甚是费解。教学中,有必要对其进行细致分析,让学生理解并掌握自增自减运算符的使用方法和技巧。
1自增自减运算符基本知识
C语言程序设计中提供了两个用于变量递增和递减的特殊运算符。使单个变量的值增加1的运算符称之为自增运算符,用“++”表示;使单个变量的值减少1的运算符称之为自减运算符,用“--”表示。自增自减运算符都是单目运算符,即只能对一个对象施加运算,运算结果仍赋予该对象,即结果保存在原变量的存储单元中。例如,int i=2;i++;执行i++后,i=3。此时,原变量i存储单元中存放的值变为3。这里i++等价于i=i+1,当然,i--就等价于i=i-1。
自增自减运算符的操作对象只能是变量,而不能是常量或表达式。只要其运算的对象是标准的变量,无论是整型、实型或是枚举型均可作为运算对象,而常量和表达式无存储单元可言,自然不能做自
增自减运算。例如:++n、i--合法,而++10、(i+j)++非法。因为若是常量,常量的值无法改变,无法自加1;若是表达式,如(i+j)++,假如i+j=5,自增后的值为6无变量空间可供存放,所以是非法的表达式。
自增自减运算符包括两种情形:前置式(++i,--i)和后置式(i++,i--)。前置式和后置式的含义分别为:++i:变量i先自增1,然后再使用该变量i的值;--i:变量i先自减1,然后再使用该变量i的值;i++:先使用变量i的值,然后变量i再自增1;i--:先使用变量i的值,然后变量i再自减1。即前置运算是“先变后用”,而后置运算是“先用后变”。当自增自减表达式作为单一语句出现时,二者没有区别,但把它们引用在表达式中则有明显区别。例如:{int i=9;x=i++;y=i;}的执行结果x=9,y=10,后置运算是“先用后变”。而{int i=9;x=++i;y=i;}的执行结果x=10,y=10,即前置运算是“先变后用”。因此,自增自减运算符放在变量的前面还是后面,其运算顺序不同,运算结果也不同。
自增自减运算符按照“自右至左”的结合性进行运算,操作数只有一个,属于单目运算符,优先级为2,高于其它双目运算符和三目运算符的优先级。例如:
int main()
{ int i=10,j;
j=-i--;
printf(“i=%d,j=%d”,i,j);}
例子中j=-i--为表达式,程序执行j=(-i)--,还是执行j=-(i--)呢?这里自减运算符“--”和取反运算符“-”都为单目运算符,优先级均为2,结合方向都自右至左。C语言规定,相同优先级运算符的运算先后次序由结合方向来决定,而两个运算符都是右结合性,故表达式执行j=-(i--)操作,执行结果是:i=9,j=-10。
2自增自减运算符的应用
学生在学习自增自减运算符时,关键是要掌握前置运算符是“先变后用”,而后置运算符是“先用后变”的运算规则。
2.1赋值语句中的应用
赋值语句中,自增自减运算符若作为前置式,其运算优先级高于其它算术运算,即先按照“自右至左”的结合性进行自增自减运算,再进行其它运算;若作为后置式,其运算优先级低于其它算术运算,即先进行其它算术运算,然后再按照“自右至左”的结合性进行自增自减运算。
例1分析下面程序段运行后的输出结果。
int main()
{inti,p;
i=5;p=(i++)+(i++)+(i++);printf("p=%d,i=%d\\n",p,i);
i=5;p=(++i)+(++i)+(++i);printf("p=%d,i=%d\\n",p,i);}
分析:在第3行语句表达式p=(i++)+(i++)+(i++)中,自
增运算作为后置式,其运算优先级低于其它算术运算。故变量i本身先参加算术运算,即p=5+5+5=15,再按照“自右至左”的结合性进行自增运算,即i++;i++;i++;最后i的值为8。注意,第3行语句表达式p=(i++)+(i++)+(i++),从理论上分析值应为5+6+7,而实际上各种编译器执行结果均为5+5+5。这说明后置式自增运算符“先用后变”的“变”是指在下一条语句执行前统一改变,而不是刚用完就变。该行语句等价于p=i+i+i;i=i+1;i=i+1;i=i+1。第4行语句执行的结果与编译器有关,在VC环境下表达式p=(++i)+(++i)+(++i),相当于p=(((++i)+(++i))+(++i)),计算机在计算形如p=(a+b)+(c+d)+(e+f)时,先计算(a+b)+(c+d),并把结果存储(例如:存储在p中),然后再计算p+(e+f)=p。所以,原语句等价于i=i+1;i=i+1;p=i+i;i=i+1;p=p+i;即p=7+7+8=22,最后i的值为8。但在TC环境下,表达式p=(++i)+(++i)+(++i)中自增运算作为前置式,其运算优先级高于其它算术运算。故先按照“自右至左”的结合性进行自增运算,即i++;i++;i++;i的值变为8,再进行加法运算,即p=8+8+8=24。造成上述运行结果的差异是因为高级语言的一条语句经编译解释成若干条机器指令,这若干条机器指令的执行顺序最终决定该等价语句的执行结果,而这两种编译环境执行的操作顺序是有差异的。2.2逻辑表达式中的应用
例2分析下面程序段运行后的输出结果。
int main()
{inti=8,j=9,k=10,p;