APP下载

VC平台下自增自减语句用例研究

2016-07-04陈松

电脑知识与技术 2016年15期
关键词:语句

陈松

摘要:自增、自减语句是C语言初学者使用时最容易出错的运算符类语句。在VC平台上,自增、自减运算符出现在printf输出语句中时,有些例题执行结果较难理解。这是因为VC平台下语句编译处理的顺序有其自身的特点,需要了解这些特点,才能更好地分析自增、自减运算符的使用方法。

关键词:自增(自减)语句;VC平台;编译顺序

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)15-0072-02

Abstract: Self increment and decrement statementis C language beginners use the most error prone operator. On the platform of VC, self increment and decrement operators in printf output statements, some examples of results difficult to understand. This is because the VC platform compiler processing sequence has its own characteristics, the need to understand these characteristics, in order to better analysis of the self increasing, the use of the reduction operator.

Key words: Self increment(decrement) statemente; VC platform; Compile order

自1972年投入使用之后,C语言成为Unix和Xenix操作系统的主要语言,是当今最为广泛使用的程序设计语言。目前各大高校的计算机及理工类专业的本、专科大多数都开设了C语言。C语言教学内容主要包括概论,数据类型、运算和输入输出,顺序、选择、循环结构程序设计、数组、函数、指针、结构体和共用体等内容[1]。学生在刚开始接触C语言时,往往会被C语言的数据类型、基本语法规则、输入输出格式等弄得烦不胜烦。不过这些知识点本身难度都不大,随着后续使用的增多,学生都会慢慢熟悉并掌握。而在C语言教学的开始阶段,学生普遍觉得较难理解的问题中主要集中在自增、自减运算语句。特别是与输出语句结合在一起使用时,有些问题的出现,一些年轻老师都不太好理解,因为这涉及了C语言在不同运行平台上编译顺序的问题。由于现在很多高校C语言上机环境采用更易于操作的VC++,本文就此平台下对自增、自减语句的教学方法及在应用举例中出现的一些问题,进行了研究和讨论,希望对C语言的教学能够起到有益补充,方便解答学生提出的一些疑问。

1 自增、自减语句简介

自增(++)、自减(--)语句在C语言教学中属于算术运算语句,从用法上可以分为两种,即先用后加(减)和先加(减)后用,如i++(i--),++i(--i)[2]。学生在学习时,一开始往往不明白“用”指的是什么,也容易疏忽不论是先用还是后用,最终变量i的值都会加1 这点。我们可以通过这样一个小例子帮助学生理解:

#include

void main()

{ int i=3,j=3,k=3,m=3;

int p,s,r,q;

p=i+++i++;

s=++j+(++j);

r=k+++(++k);

q=++m+m++;

printf("p=%d,s=%d,r=%d,q=%d\n",p,s,r,q);

printf("i=%d,j=%d,k=%d,m=%d\n",i,j,k,m); }

运行结果如图:

分析以上程序可知p的值是由3+3计算得来,求和赋值也就是对i使用后,i的值做了两次加1操作,先用后加,最终值为5。S的值是由5+5计算得来,是先对j的值做了两次加1,再求和赋值,先加后用。r和q都是由4+4计算得来,k和m先加后用了1次,变成4,求和赋值后,再做一次先用后加变成5。在分析完此例后,可将例子中的自增改为自减,让学生来分析下执行结果。

2 自增、自减语句教学重点

自增、增加语句在编程时常用于循环结构中修改循环变量[3],当然也可用于赋值语句、逻辑表达式、指针等[4]。对于初学者首先应该熟练掌握自增、自减语句与if…goto…、while、do…while、for等语句的连用。如下面两个小例子:

#include

void main()

{ int i;

for(i=1;i<4;i++) ;

printf("%d\n",i); } /*i的值为4*/

#include

void main()

{ int i;

for(i=1;i++<4; ) ;

printf("%d\n",i); } /*i的值为5*/

这两个例子中由于i++语句位置不同,循环次数不同,i的值也不同,此例也可用于帮助学生理解空语句,for语句的执行等。很显然学生自己在编程时,按第一种用法的情况更常见,但考虑学生有计算机考证方面的需求,还是应该提高学习要求,对自增、自减语句不仅会自己编程使用,也要能看懂他人编写的程序中的用法,因此可以把这个知识点理解得更深入一点。

3 学生在Printf函数中使用出现的疑问

在中国水利水电出版社的《新编C语言程序设计教程》教材中第2章课后习题中有这样一个程序阅读题:

#include

void main()

{ int i;

i=8;

printf("%d,%o,%x\n",i++,i++,i++); }

上机运行的结果是:

按十进制、八进制、十六进制显示i++的值是8、10、8,即3次i++的显示结果值大小是一样的,都是8。学生会提这样一个问题:i++是先用后加,那么第一次i++显示后,i的值加1,则第二个i++的值显示应该是11(换算成十进制,即为9),第三值应该显示为a(换算成十进制,即为10)。如果此例改为:

#include

void main()

{ int i;

i=8;

printf("%d \n",i);

i++;

printf("%o \n",i);

i++;

printf("%x \n",i); }

显示结果如学生期望的,按十进制看,三次显示结果为8,9,10。为什么自增语句放到printf语句中显示结果就不同呢?有的教师是这样解释的:在printf语句中,自增、自减语句只计算不存储。就是说计算机只是显示了运算结果,而没有把运算结果都存放到对应的变量中。从刚刚的例子表象看,似乎可以解释得通。但笔者仍存在疑问,如果在printf语句中自增、自减的结果没有存储,而只有赋值语句才存储结果,那么为什么在其他语句中使用自增、自减,结果都存储了呢?真的是printf语句比较特殊吗?

4 问题分析与原因探究

为了进一步分析这个问题,笔者上机运行了下例:

#include

void main()

{ int i=5;

i++;

printf("%d\n",i);

printf("%d,%d\n",i,++i);

printf("%d\n",i);

printf("%d,%d\n",i,i++);

printf("%d\n",i); }

此例中可以看出第一条printf语句中显示的是i(初值为5)增1之后的结果,第二条printf语句中有一个先加后用的自增运算,如果没有存储的话,第三条printf语句显示的结果是6,而实际情况是第三条printf语句显示结果是7,这说明变量i的值完成了第二次的增1操作。第四条、第五条printf语句的显示结果,也说明了先用后加的自增语句也得到了存储。这说明printf中的自增语句并不是不存储,先加后用、先用后加中的“用”在printf语句中指的是显示输出,显示输出后最终还是执行加1操作并存储的。不过此例中又出现一个奇怪的现象,第二条printf("%d,%d\n",i,++i);语句中,先显示i的值,再显示i++的值,如果按照我们书写的顺序,即从左到右的顺序来理解,则第一个i的值为6,第二个++i的值先加后用值为7。但结果显示的却是7,7。这又是为什么呢?笔者将上例改为:

#include

void main()

{ int i=5;

i++;

printf("%d\n",i);

printf("%d,%d\n",++i,i);

printf("%d\n",i);

printf("%d,%d\n",i++,i);

printf("%d\n",i); }

显示结果如图4所示:

在将++i与i交换显示位置,i++与i也交换显示位置后,结果发生了一点变化。printf("%d,%d\n",++i,i);显示结果变成了7,6。按由左向右的顺序看,i的值既然已经加1变成7了,为什么第二个i的值反倒是6呢?貌似如果两次结果颠倒过来了。这个问题,如果我们换个方向去理解就能说通了。我们从右向左看,printf("%d,%d\n",i,++i);中首先执行显示++i,i赋值为7,再执行显示i,也为7。printf("%d,%d\n",i,i++);中首先执行显示i++,由于是先用后加,值依然为7,再执行显示i,i的值仍为7(因为显示操作还没结束,可以认为先用后加中的“用”还没执行完,这里的“用”是printf)。printf("%d,%d\n",++i,i);中首先执行显示i的值,i为6,再显示++i的值,先加后显示,则值为7。printf("%d,%d\n",i++,i);中先显示i的值,此时已为7,再显示i++的值,先用后加,结果仍为7。

5 总结

VC平台下,printf语句在编译时是从左往右的,读取的内容放入堆栈中,执行时从栈顶开始,由于堆栈是后进先出的,实际执行顺序是从右往左的。因此学生在遇到出现在printf语句中自增、自减运算时,判断输出结果应该先从左到右去除多余变量,如在printf("%d,%d\n",i++,i,i+3);语句中,最后一个i+3不显示其值,再从右到左的判断各表达式或变量的值。由于不同平台语句编译顺序不同,建议学生不要使用容易产生歧义的自增、自减语句,以免因平台不同而造成执行结果不同。

参考文献:

[1] 孙家启,万家华.新编C语言程序设计教程[M].北京:水利水电出版社,2013.

[2] 董卫红.浅谈自增自减运算符在C语言中的应用[J].微型电脑应用,2012,28(1):49-50.

[3] 周伟.C语言中自增自减运算符教学探究[J].软件导刊,2012,11(12):188-190.

[4] 李彩玲.C语言中自增自减运算符的应用与解析[J].晋城职业技术学院学报,2013,6(3):78-80.

猜你喜欢

语句
语句转换
循环语句重点剖析
韩寒作品经典语句
算法语句常见错误举隅
例谈基本算法语句
基本算法语句
我喜欢
C语言循环语句的分析与应用
作文语句实录
伪代码教学中的几点关注