摘 要:C语言是应用最广的高级程序设计语言,其语法灵活,使用便捷。文章在Turbo C环境下,提出几种常见的编译系统纠错无法判断的问题,分析了几种运算符、语句结束符和ELSE等,并通过案例来比较分析程序运行结果,为广大C语言程序学习者提供一些参考。
关键词:C语言;运算符;表达式;判断条件
C语言既有高级语言的特点,又有汇编语言的特点,因此它是应用最广的高级程序设计语言。用它不但能编写操作系统软件,也能开发各个领域的应用软件。目前在我国,众多的本科和高职院校的理工科专业都把C语言作为一门必修课程。C语言可读性强、容易维护、移植性好[1],它具有丰富的运算符与数据类型,也正因为这些,在学习C语言的过程中会出现很多困难和问题。
1 运算符与表达式
运算符是表示某种操作的符号,在C语言中运算符主要有:赋值运算符、算术运算符、逻辑运算符等。运算符的操作对象称为运算数,表达式是用运算符把运算数连接起来的式子[1]。只是认识运算符并不难,可是一旦将运算符与运算数结合成表达式时就很容易出现知识混淆产生问题而不知该如何入手解决。
1.1 赋值运算符“=”和关系运算符“==”
赋值运算符“=”在平常生活与基础学习中就是“等于”的意思,但是在C语言中却不能理解为普通的“等于”的意思,应理解为“赋予”或“给予”的意思,而作为判断平等的“等于”在C语言中用关系运算符“==”来表示。
因为习惯性使然,在编程时经常会出现误写“=”作为判断的“等于”,这样就使得所要完成的功能语句出错,而这种错误是编译系统无法判断出的错误。
例如:下列程序语句实现功能是:当变量x的值,在运行过程中等于0时,输出错误提示:error!
“error!”的错误提示,表面上两个只有“=”与“==”不同的语句都没有什么问题,结果都是正确的。但是,如果将int x=0变更为int x=1,运行结果却是:第一句判断显示的结果还是“error!”的错误提示,第二句判断没有显示输出。实际上结果是很明显的,当x=1时是不要输出错误提示的,而第一句判断仍然是“error!”的错误提示,这是不对的,问题出在第一句判断句的(x=0)中的“=”,该式子表达的意思是把0赋予x,因此无论前面如何改变x的值,执行到第一句判断句时x的值就会被改变为0,判断的结果永远都是输出错误提示。
1.2 逻辑或运算符“||”和逻辑与运算符“&&”
逻辑运算的结果为逻辑值,逻辑值只有两个值:“真”和“假”,在C语言中用1表示“真”,用0表示“假”[2]。逻辑运算符的运算数一般为逻辑值,如果不是逻辑值的会自动转为逻辑值,转换的规则是:0为逻辑假,非0为逻辑真。
逻辑或“||”:如果两个运算数都是假的,则结果是假的,否则结果为真;
逻辑与“&&”:如果两个运算数都是真的,则结果是真的,否则结果为假;
逻辑或“||”和逻辑与“&&”的表达式运算规则
如果依靠死记硬背这些规则,不常用时是容易混乱出错的。为了方便记忆可以用一个生动的比喻来帮忙,就是逻辑或“||”是一个“好好老师”而逻辑与“&&”则是一个“严格老师”。怎么解释应用呢?可以这样看:“好好老师”(或“||”)的要求比较松,只要两个数有一个是“真”的就可以通过,结果就是“真”的;而“严格老师”(与“&&”)比较严格要求只有两个数都是“真”的才能通过,结果才是“真”的,如果有一个是“假”的就不能通过,结果就是“假”的。
除了上表的运算规则还要注意逻辑运算规律是:从左到右的运算的。“好好老师”(或“||”)在运算时如果一直是“假”的就一直向左运算,只要遇到“真”的就结束运算结果为“真”或全部操作数运算结束仍然没有“真”结果就为“假”。“严格老师”(与“&&”)在运算时如果遇到“假”就结束运算结果为“假”,只有一直遇到“真”的才能继续运算,直到所有操作数结束,结果为“真”。
这两个运算符在C语言中是很常被使用的,在使用过程中它们还分为前缀运算和后缀运算两种[3]。它们只作用于变量,不能用于常量和表达式,如:1++,(a+b)++都是不对的,但是自增、自减的变量是可以出现在表达式中的,如:a=a+b++是可以的。
运算中变量本身的自增与自减是很容易的,但是与之结合的表达式运算就会出现无法抉择的情况。
例子中的x、y的值都与原来预计中的不同的原因是:
在x=j+i++中,i++是后缀引用,是先将变量i的值引用到表达式中参加运算后再自增,即x=j+i=1+1=2,i=i+1=2,而不是i=i+1=2,再x=j+i=1+2=3,注意:即使加上括号变为x=j+(i++)运行时也是一样的。
在y=j+++i中,本意是要做前缀运算++i的,但因与前面的算术运算符+连在一起出现了混乱,是应该运算y=j+(++i)还是运算y=(j++)+i。如果是y=j+(++i),表达式的结果就会是预想中i=i+1=2,y=j+i=1+2=3,但结果却是y=2,应该是运算y=(j++)+i,自增的变量对象由i变成了j,j++也是后缀引用,因此最后的结果变为:y=j+i=1+1=2,j=j+1=2。在y=j+++i中变为运算y=(j++)+i的原因是自增和自减的运算优先级高于算术运算符,+++放在一起就要先运算++再运算+。
情况3:
在这个表达式中变量i的自增出现多次,使得运算起来很复杂,这时要注意的是自增与自减运算规律是:自右向左。j=(i++)+(i++)+i+(++i);执行的运行过程可以看成:
①从右边的++i开始执行,i=2;
②j=i+i+i+i,i++中的i的都是先参与表达式运算再自增,j=2+2+2+2=8;
③先后执行两次i++,最后i的值变为4。
执行的过程比较复杂,不易读懂和判断结果,而且在不同的编译环境下运行的结果也不一定是相同的,所以在表达式中同一个变量多次出现时,不宜使用变量自增、自减运算。
2 语句结束符“;”的问题
在C语言中每个语句的结束是以“;”为结束标志的[4]。语句后如果多加了一个分号并不是错误,可以将之看作是个不执行任何操作的空语句,这时编译系统是会发出警告提示的,提醒用户注意并可以进行修改。但是有些时候有些特殊位置加上分号系统是不会提示的有问题的,如
①if(x==0)printf("error!\n");加个分号在条件后面if(x==0);printf("error!\n");没有细看是不易发现的,但是这时执行这个句子时,无论x的值是否为0,都会输出“error!”的语句。这次不是赋值“=”与“==”的问题,而是多出分号造成的问题。加了分号的句子应该理解为:
如果在while(x++
3 “else”问题
在C语言中else是必须和if一起配对使用的,不可以独立使用,它的后面没有括号即没有条件,条件相当于默认是与if小括号的条件相反的所有条件[1]。
if... else 配对原则是:缺省{ }时,else总是和它上面离它最近的未配对的if配对。
上面例子中第一个else就与前面的if配对,第二个else就不能再与该if配对了,前面没有其他的if可以与它配对。第二个else就被独立出来单独使用,else本身是没有条件的,要否定与其配对的if的条件来做其本身的条件,这样的else就没有办法真正的执行。要正确的完成上面的程序就需要给第二个else配个if,如:
补充完整语句后,最好能够使用缩进将相关联的语句进行对齐,这样便于读程序,可以看出第一个else是与第一个if配对,它是否定x>80这个条件的即它的条件是小于等于80的执行后面的语句。第二个else是与第二个if配对的,它的条件是小于等于60执行后面的语句。如果这样还是不易看懂,可以再加上大括号变为:
这样就比较清晰明确了。else的配对错误问题不仅是上面这种情况,还有很多,主要是能掌握if...else配对原则才能判断出正确的配对情况。
总之,C语言中的灵活特点,使得学习时要灵活运用规则来掌握各种特殊情况的处理办法。掌握好C语言为将来多方面的程序设计学习之路打下基础。文章中实例的运算结果是在Turbo C环境下得出,不同的系统环境结果可能有些不同,请读者见谅。
[参考文献]
[1]熊锡义.C语言程序设计案例教程[M].大连:大连理工大学出版社,2009.5.
[2]龚民.C语言程序设计实用教程[M].青岛:中国海洋大学出版社,2011.8.
[3]许崇,王秀红,王洪信.C程序设计语言中两个疑难问题的探讨[J].科技与生活,2010(4):23.
[4]雷萌,赵亚妮.C语言疑惑经验谈[J].软件导刊,2011(3):80-82.