当前课程知识点:C语言程序设计 > 第22讲 编程训练 > 编程训练 > 选择结构常见错误
这一讲
讲一下选择结构常见的错误
错误1 if语句后写了分号
我们看例1
if(a>b)
这儿有一个分号
然后后面是max=a
这种情况编译不会出错
但很可能跟你想要表达的含义不一样
你想表达的含义是
如果a>b,那么让a赋值给max
但是你这样写了以后
它等同于下面这个样子if(a>b)
就是a大于b的时候
执行一条空语句然后a赋值给max
在这里
不管上面a是不是大于b
这个地方都会把a赋值给max
就是这一句和上面一句完全没有关系
因为通常来说
我们写一个条件判断
总是要在后面
满足这个条件以后要执行什么语句
很少或几乎没有说一个条件语句后面什么都不执行
我们看例2
这是一个if和else的语句
在这个地方
在if(a>b)后面加了一个分号
这种情况下编译就会出错
我们来看一下程序
我们来看一下
这个程序就是把刚才ppt当中核心的一段放在这儿
在这个地方加了一个分号
我们编译一下
来看看情况
我们可以看到
在这个地方有一个提示一个错误
elsewithoutpreviousif
这个意思是说else前面没有与之匹配的if
为什么会这样呢 你写成这个样子
它表示的含义是这样
刚才前面也说过了
它表示的含义是
如果a大于b
执行一条空语句
然后把a赋值给max
这个else已经和上面没有关系
我们知道
在c语言当中
else必须有一个前面跟它匹配的if
所以正常的写法这个地方
应该把这个分号删掉
这样删掉以后
这个if和else整个就构成一个整体
这个意思是如果如果a大于b这个条件满足
把a赋值给max
else就是它的反例
那么a>b的反例
a>b的反例就是a小于等于b的时候
把b赋值给max
这是一个正确的写法
那同学如果犯了这个地方加了分号的错误
就会提示有这个错误
你以后写程序的时候
如果发现有这个提示错误
你就知道这是怎么引起来的
错误2:复合语句忘了花括号
这个类型的错误和刚才错误1很相似
我们看例1
你本来想写的意思是如果a>b
然后呢
让a赋值给max
同时输出这一句
但是你这样写了以后
这个地方没有花括号
你这样写了以后
它的含义就是如果a>b满足这个条件
执行下面这一句
而这个printf这一句
它跟上面没有关系
就是不管上面这个条件满足不满足
它是单独的一句
它永远都会执行
你想表达的意思
刚才说了
你想表达a>b的时候
要多条语句都执行
应该在这个地方加一个花括号
让它构成一个整体
当然了
这个语句完成的功能和你想要表达的意思不符合
但是它没有编译错误
程序会运行
我们看例2
例2这儿你本来想表达的意思是如果a>b
执行这两句
else就是a小于等于b的时候
执行下面这两句
但是因为你在这个地方没有加花括号
这儿加一个花括号
这儿加一个花括号
把这两句搞成一块
同样的
这儿也没加
那么这个情况下
编译会出错
是个什么错误呢
跟前面错误1的例2一样
也会提示你else没有与之匹配的前面的if
为什么会这样呢
这儿解释一下
你这么写了以后
这个if(a>b)和max=a是一体的
完了以后从printf一直到后面
这是单独的一条语句
后面else也是
这个else就跟这个if没有关系
所以会出现这个错误
第三种常见的错误是误将判断相等写为赋值
这种错误编译器有提醒警告错误
程序仍然能运行
但运行会出错
对于初学者
这种错误比较隐蔽
常常难以发现
if(a=b) 输出a=b
那么
你很可能想表达的意思是这样 两个等号
在c语言中
单等号是赋值的意思
而要想判断两个值相等
使用两个等号
所以应该这样写才是正确的
如果你写成上面这个样子
编译的时候会有个警告错误
在c语言中
你这么写了以后
它是把b赋值给a
如果b的值不为0
这个地方条件就为真
它就会执行这条语句
所以并不是判断a等于b的问题
而是这个地方只是把b赋值给a
如果b不等于0
这个条件都是真的
都会执行这个
那多半跟你想表达的意思不同
错误4 逻辑上可能错误的表达
你本来想判断一个变量是否在0-100之内
结果你写成了这样if(0<=a<=100)
这种写法我们在数学中很常见
也是正确的表达
但是在c语言当中
这样写是错误的
为什么呢 我们来分析一下
假定现在变量a的值是200
C语言是这样处理的
先处理0<=a 因为a的值是200
所以这个结果为真
结果为真
它的值就为1
就是这个的值为1
然后再处理1<=100 就是后半部分
当然这个结果仍然为真
这样呢
这个表达式的结果为真
但是显然跟你想要判断变量是不是在
0-100只内的想法是不符的
那么正确的要想判断一个变量是否在0-100之内
就是大于等于0
小于等于100怎么写呢
应该写成这样 分两部分
这个a>=0并且a<=100
第5种错误是switch语句中缺少break
会导致程序运行出错
我们以程序来看一下
这个程序是前面讲过的
把百分制把转换成5级等级制的这样一个程序
我们看 正确的程序它是大于等于90
小于等于100的时候
输出A 从80到89分 给出B
后面是其它情况
我们看这个地方
如果这儿把break语句漏掉了
我们把它注释掉
注释掉就跟没写它一样
好 我们编译运行一下
比如我们输入98
大家看 得到的结果是AB
这个显然是不对的
我们把break照旧加上去
重新来执行一下
还是98
这儿就得到了正确答案
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-循环类型
-作业
-程序结构
-函数基础
-作业
-数组基础
-作业
-作业
-作业
-作业
-程序调试
- 文件(上)
- 编程训练