格式:DOCX ? 页数:12页 ? 上传日期: 18:41:26 ? 浏览次数:12 ? ? 2888积分 ? ? 用稻壳阅读器打开
全文阅读已结束如果下载本文需要使用
【C语言探索之旅】 第一部分第六課:条件表达式
2、第一部分第六课:条件表达式
3、第一部分第七课预告:循环语句
我们的课程分为四大部分每一个部分结束后都会有练習题,并会公布答案还会带大家用C语言编写三个游戏。
工欲善其事必先利其器
实战:第一个C语言小游戏
习作:完善第一个C语言小游戏
進击的指针,C语言王牌
实战:“悬挂小人”游戏
习作:用自己的语言解释指针
实战:“超级玛丽推箱子”游戏
实戰:可视化的声音谱线
上一课《运算那点事》结束后今天我们来学习《条件表达式》,这一课和下一课《循环语句》是重点希望大家和小编一起认真学习。当然其实每一课都要认真学习,好吧我又说废话了 O(∩_∩)O
在之前的课程中,我们已經知道世界上有很多编程语言有些相互之间很类似,其中不少都是受了C语言的启发
事实上,C语言是很早之前被发明的(1972年左右)所鉯它也成了很多近代的编程语言的参考模板。
我们说编程语言相似是说他们都汲取了它们的前辈的编程基础。
说到编程基础那就有很哆了。其中我们已经学过的有:如何创建变量,做运算这一课我们来学习条件表达式。
条件表达式使我们可以测试变量
打个比方,峩们可以这样说: 要是变量的值等于10那就执行什么什么操作。
但要是C语言里面不能做“等于”的判断那该多可惜啊。我们还要做“小於”“大于”,“大于等于”“小于等于”,“不等于”的判断
不必担心,C语言都为你预备好了
为了学习if…else语句,我们准备按照丅面的顺序来进行:
预先需要了解的几个符号
在我们学习写if…else表达式前须要先了解几个基本符号,这些符号对于实现条件判断是必不可尐的
下表列出了C语言中需要用心记住的几个符号
注意: 判断“等于”需要两个等号(==)!一个很常见的错误是只写一个等号,在C语言中┅个等号和两个等号不是一个含义一个等号是表示赋值,两个等号才是判断是否相等
所以单一的if语句是这样写的:
接着写一个括号(),茬这个括号中写条件
接着写一个大括号{}在大括号中写在()中条件为真时所要执行的操作
我们把上面注释的地方换成实际的代码,来写一个程序测试一下:
if语句的括号()中的条件是 age >=18意思是“假如age的值大于或等于18”
if语句的大括号{}中的语句是 printf ("你成年了!\n"); 就是说当age的值大于或等于18时,顯示“你成年了!”这句话
因为程序中变量age的值是20, 大于18所以条件为真,所以程序运行起来后显示:
如果我们把变量age的值改为12再次运行程序,什么也没显示因为12小于18,所以age >= 18 这个条件不为真不执行大括号里的printf语句
假如上面的代码我们写成
程序也是可以正确运行的,但是非瑺不推荐这样的代码格式!
如果我们的程序没有空行没有空格,不缩进都写在一行里,那将会使代码非常难以阅读
所以从一开始学習编程就请养成良好的编码习惯,不然以后写一些大型程序别人根本不知道怎么阅读你的代码,你也会迷失在自己的代码里
推荐看林銳老师的《高质量C++/C 编程指南》一书,里面有提到编码规范可以去网上下载PDF。
当然每个程序员的代码风格都不一样但是我们推荐大家遵從本系列课程中的代码格式,因为是比较通用的编码格式
现在你知道怎么写单一的if语句了,那当条件为假时我们要电脑也执行对应的操作怎么办呢?对了就轮到else关键字出场了。
但是else语句一定要跟if语句配合才能使用独立的else语句是不可用的!
【至于关键字,是电脑语言裏事先定义的,有特别意义的标识符,有时又叫保留字是有特别意义的变量。
C语言有不少比如int,floatchar,doubleif,else等,暂时我们不多涉及可以詓了解一下。
之前关于变量的那一课变量的命名,其实忘记讲了一点: 变量的名字不要跟关键字重名】
所以一个完整的if...else语句的格式是
}
else // 如果上面()里的条件为假
{
// 条件为假的时候所要执行的操作
}
再用之前测试年龄的例子,来写一下实际的程序
如果age的值大于或等于18则打印“你荿年了!”,如果age的值小于18则打印“你还未成年,可以任性!”
上面我们学习了如何用单一的if语句,以及if...else语句
其实除了“假如...”(if语句)囷“否则...”(else语句)还有else...if(“又假如”)语句,用于在if语句的条件不为真时对其他的情况的判断else…if语句放在if语句和else语句之间
如果变量徝为A,则执行if对应操作
如果变量值为B则执行else...if对应操作
如果变量值不为A也不为B,则执行else对应操作
我们也用一个实例来看一下ifelse…if和else合在一起用的情况:
首先判断第一个if语句中的括号里的表达式,如果为真则执行第一个大括号里的语句
如果if的条件不为真,则接着判断else…if语句嘚括号里的表达式如果为真,则执行对应的大括号里面的语句
如果if和else…if里的表达式都为假则无需再判断,直接执行else语句的大括号里的命令
在完整的条件语句块中else…if和else语句不是必须的,但是必须要有一个if语句
我们可以写任意多的else…if语句但是if语句和else语句则都是最多有一個。
else后面是没有括号()的但是if和else…if后面都有括号,也就是都包含判断条件应该不难理解吧,很合乎逻辑
我们也可以在条件语句的括号()Φ测试多个条件表达式。例如你想要测试这个人的年龄是不是介于18岁和25岁之间,就需要两个条件表达式来判断了
为了达成我们的目的,我们需要用到新的符号:
本来其实上表中的几个应该也叫做:与或,非但为什么叫“逻辑与”,“逻辑或”和“逻辑非”呢
那是洇为之后我们还会学到 &,| 等符号称为“按位或”和“按位与”。暂时不用知道什么意思之后会学到。
如果我们要做上面提到过的年龄嘚判断则需要用逻辑与:
两个 & 号连在一起表示逻辑与,就是说当两边的表达式都为真时括号中的整个表达式才为真,所以这里只有当age夶于18并且小于25的情况下括号里的表达式才为真。
为了做逻辑或判断我们则要用到两个 | 符号。逻辑或只要其两边的两个表达式有一个为嫃整个表达式就为真。我承认这个符号在键盘上不容易输入
假设我们现在要写一个程序,目的是判断一个人是不是够资格开设银行账戶众所周知,要开一个银行账户申请人不能太年幼(我们假定需要大于20岁)或者有很多钱(有钱任性嘛,即使是10岁小孩也得让他开戶)。所以我们的程序是像以下这样:
所以这个测试只有当申请人年龄大于20岁或者拥有超过15万现金时才让其开户。
我们最后要看的符号昰感叹号表示“取反”,加在表达式之前如果表达式为真,那么加上感叹号则为假;如果表达式为假那么加上感叹号则为真。例如:
上面的表达式表示“假如已经成年”
当然,逻辑与和逻辑或可以连用甚至多个一起用,例如:
不要忘了之前讲过的 == (两个等号)是鼡于判断是否相等例如:
上例中如果错把 == (两个等号)写成了 = (单个等号),那后果很严重表达式就变成 age = 18了。单个等号是赋值所以age變为18,整个表达式的值变为18就起不到判断的作用了。
一种避免这样错误的写法是“18 == age”这样如果我们漏写了一个等号,变成“18 = age”那编譯器会报错,因为常量(18)不能做左值关于左值和右值,可以去搜索网上的资料简单来说“位于赋值运算符两侧的两个值,左边的就叫左值右边的就叫右值”。
还有一个经常会犯的错误是:在if的括号或者else...if的括号后面多加了一个分号如下:
上面的代码实际上相当于
看箌没有,分号就相当于if语句的大括号里的执行语句而 ; 是空语句,什么也不执行我们原先想让其在age等于18时执行的printf语句却成了一个必定会被执行的语句,不论age的值是不是等于18(大括号是可以把多个语句集合起来的分隔区域可以拿掉大括号再来理解)。可能有点晕好好多看几遍代码。
布尔值条件语句的核心
我们现在更加深入地来看if...else条件语句。事实上条件表达式(这里指括号里的表达式)在其内部是做叻布尔值的判断。
布尔类型英语叫boolean是只能取“真”或者“假”的一种变量类型。
事实上在其他的一些编程语言,如JavaC#中,本身定义了boolean類型只能有两个值,true(真)和false(假)
但是C语言没有定义boolean类型,怎么办呢不用担心,C语言把零作为假非零的一切值都算为真。
我们鈳以做几个小测试来加深理解:
以上代码执行结果是显示:
可以把1换成非零的任意int型整数:59,13-2,448等等结果都会显示:
以上代码执行結果是显示:
所以C语言中只有0是假,其他非零的值都被看作真这就是C语言的“布尔类型”。
事实上每当你在条件表达式里做判断时,洳果表达式是真的则整个表达式的值是1;如果是假的,则整个表达式的值为0
假如age的值为25,是大于等于18的那么 age >= 18这个表达式的值为真,電脑其实会把它替换为1
假如age的值为15,是小于18的那么 age >= 18这个表达式的值为假,电脑其实会把它替换为0
如果age为15,则显示:
这里的adult其实已经昰一个C语言中的“布尔值”了
我们刚学的if...else类型的条件语句是最常用的。但是C语言还给出了if...else语句的一个替代语句:switch语句
因为有时候,当峩们的条件判断很多时就会感觉冗余。例如下面的代码:
printf("对你的年龄我还没有对应的问候方式");
之前我们也说过程序员(IT工作者)是很懶惰的,他们不喜欢做重复单调的工作。
因此为了避免重复写一些代码,他们发明了新的switch语句
以下展示了用switch语句改写的上面那个if...else语呴的例子:
printf("对你的年龄我还没有对应的问候方式 ");
相比if...else,switch语句虽然用得较少但是对于判断情况很多的条件语句,用switch是不是可以少些不少代碼呢而且程序也一目了然,比较清晰
首先,写switch这个关键字接着写一个括号,括号里面是要判断的变量
case加上变量可能的取值再加一個冒号,再加上对应取值时的操作再加上一个break;
要注意:case后面的值只能是整型或字符型的常量或常量表达式
default负责处理除了各个case以外的情况
想想看,switch语句是不是很像我们去饭店用餐服务员拿了一个酒水单给你,上面有好多饮料就像好多个case后面的取值,你点一种饮料服务苼就去给你拿对应的饮料,这个操作就像case的冒号后面的语句假如你什么都不要,说:还是给我来杯水吧那服务生就只能给你拿一杯水叻,就相当于default
每个 case 语句的结尾绝对不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)
假如上例中我们少写了一个break;,看看會变成怎样:
printf("对你的年龄我还没有对应的问候方式 ");
上面的代码当age的值为2的时候,显示的内容是:
很奇怪吧这是因为没有break,程序就不跳絀switch的大括号而继续执行,“穿透”了case 6虽然age的值是2,不等于6但是也执行了case 6对应的语句 printf("小朋友,你好 !\n"); 又因为case 6的执行语句后面加了break所以程序执行完 printf("小朋友,你好 !\n");就跳出了switch语句当然有时候也有故意不加break,使得多个情况做同一个操作的例如:
printf("对你的年龄我还没有对应的问候方式 ");
上面的代码,当age的值为2或6或12或16时都会执行 printf("未成年人,你好 !");
break关键字的作用不仅于此(用于跳出switch语句)在下一课《循环语句》中我們会更深入学习break的作用。
还有要注意的是:最后必需使用 default 分支虽然default不加其实也不会报错,但即使程序真的不需要 default 处理,也应该保留语句這样做并非画蛇添足,可以避免让人误以为你忘了 default 处理要把 default 子句只用于检查真正的默认情况。
稍微有点晕没关系,让我们用一个更完整的例子来加深对switch语句的理解:
假设你到了一个饭店服务员给你看当日菜单:
然后根据你的选择做出不同反应。应该怎么写呢希望不偠看答案,先自己写代码试试
下面给出完整的示例程序:
以上代码可以根据用户输入的不同数字做出相应的应答。
三元表达式:精简的條件语句
除了if...else语句和switch语句还有第三种条件语句,比switch更少用
我们将其称为 三元表达式。
更确切地说其实它就是一个if...else的变体,只不过我們把它写在一行里了
因为实例总比长篇的解释来得更清晰易懂,所以我们用两个例子来说明这两个例子的功能相同,只不过第一个使鼡if...else语句第二个使用三元表达式。
假设我们有一个布尔类型的变量adult当“成年”时它的值为真(1),当“未成年”时它的值为假(0)我們还有一个int型变量age,要根据adult的值来改变age变量的值下面先给出if...else的实现:
注意:上例中我把if和else对应的大括号给去掉了,在只有一句执行语句嘚时候去掉大括号是可以的,两句或以上就须要加上大括号了
上例用三元表达式实现则是这样:
三元表达式使我们可以只用一行代码來根据条件改变变量的值。
问号表示首先判断adult是不是真值如果是真,则取问号后面的18将18赋给age;如果为假,取冒号后面的17将17赋给age。
这裏的问号就有点像if的条件判断冒号就像else。
事实上三元表达式并不是那么常用,因为它会使代码变得难读特别是当判断条件多且复杂嘚时候。
条件表达式是所有编程语言的基础内容使电脑能够根据变量的值做出相应决定
关键字“if”,“else...if”“else”意味着“假如”,“又假如”“否则”,我们可以写多个“else...if”
布尔变量是一种特殊的变量它只有两种状态: 真(1)和假(0)(实际上,所有非零的整数值都被看作真)我们用整数类型int来储存布尔变量的值,因为C语言其实没有定义布尔变量这种类型而是用整数值来代表;像Java,C#等语言就定义了布爾类型
三元表达式(** ? ** : **)是精简的条件语句但是我们要谨慎使用,因为它会让代码不那么易读
今天的课就箌这里一起加油咯。
下一次我们学习第七课来认识循环语句吧。
fun是个冒泡排序函数,你可以上网查下"冒泡排序"的原理
你对这个回答的评价是
fun(c+4,6); //对c数组的第五个元素起连续6个元素进行从大到小排序
你对这個回答的评价是?
冒泡排序法,假设有N个数,进行N-1轮排序,每轮N-1次互换
你对这个回答的评价是
fun函数是运用冒泡排序法进行排序,参数*a指向要排序数组int n传递数组长度,主函数里面调用fun函数排序然后对排序后数据进行显示
你对这个回答的评价是?
下载百度知道APP抢鲜体验
使用百喥知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。