[ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

C语言入门:选择与循环语句功能介绍,一看就懂

一看 介绍 功能 语言

C语言入门:选择与循环语句功能介绍,一看就懂

第 5 章 选择语句

不应该以聪明才智和逻辑分析能力来评判程序员,而要看其分析问题是否全面。

尽管C语言有许多运算符,但是它所拥有的语句相对较少。到目前为止,我们只见过两种语句:return语句(➤2.2节)和表达式语句(➤4.5节)。根据对语句执行顺序的影响,C语言的其余语句大多属于以下3类。

  • 选择语句(selection statement)。if语句和switch语句允许程序在一组可选项中选择一条特定的执行路径。
  • 重复语句(iteration statement)。while语句、do语句和for语句支持重复(循环)操作。
  • 跳转语句(jump statement)。break语句、continue语句和goto语句导致无条件地跳转到程序中的某个位置。(return语句也属于此类。)

C语言还有其他两类语句,一类是复合语句(把几条语句组合成一条语句),一类是空语句(不执行任何操作)。

本章讨论选择语句和复合语句。(第6章会介绍重复语句、跳转语句和空语句。)在使用if语句之前,我们需要介绍逻辑表达式:if语句可以测试的条件。5.1节说明如何用关系运算符(<、<=、>和>=)、判等运算符(==和!=)和逻辑运算符(&&、||和!)构造逻辑表达式。5.2节介绍if语句和复合语句,以及可以在一个表达式内测试条件的条件运算符(?:)。5.3节描述switch语句。

5.1 逻辑表达式

包括if语句在内的某些C语句必须测试表达式的值是“真”还是“假”。例如,if语句可能需要检测表达式i < j,若取得真值则说明i小于j。在许多编程语言中,类似i < j这样的表达式都具有特殊的“布尔”类型或“逻辑”类型。这样的类型只有两个值,即假和真。而在C语言中,i < j这样的比较运算会产生整数:0(假)或1(真)。先记住这一点,下面来看看用于构建逻辑表达式的运算符。

5.1.1 关系运算符

C语言的关系运算符(relational operator,见表5-1)跟数学上的<、>、≤和≥运算符相对应,只不过用在C语言的表达式中时产生的结果是0(假)或1(真)。例如,表达式10<11的值为1,而表达式11 < 10的值为0。

关系运算符可以用于比较整数和浮点数,也允许比较混合类型的操作数。因此,表达式1 < 2.5的值为1,而表达式5.6 < 4的值为0。

表5-1 关系运算符

C语言入门:选择与循环语句功能介绍,一看就懂

关系运算符的优先级低于算术运算符。例如,表达式i + j < k – 1意思是(i + j)<(k – 1)。关系运算符都是左结合的。

C语言入门:选择与循环语句功能介绍,一看就懂 表达式i < j < k在C语言中是合法的,但可能不是你所期望的含义。因为<运算符是左结合的,所以这个表达式等价于

(i < j) < k

换句话说,表达式首先检测i是否小于j,然后用比较后产生的结果(1或0)来和k进行比较。这个表达式并不是测试j是否位于i和k之间。(在本节后面会看到,正确的表达式应该是i<j && j<k。)

5.1.2 判等运算符

C语言中表示关系运算符的符号与其他许多编程语言中的相同,但是判等运算符(equality operator)有着独一无二的形式(见表5-2)。因为单独一个=字符表示赋值运算符,所以“等于”运算符是两个紧邻的=字符,而不是一个=字符。“不等于”运算符也是两个字符,即!和=。

表5-2 判等运算符

C语言入门:选择与循环语句功能介绍,一看就懂

和关系运算符一样,判等运算符也是左结合的,并且产生0(假)或1(真)作为结果。然而,判等运算符的优先级低于关系运算符。例如,表达式i < j == j < k等价于表达式(i < j) == (j < k)。如果i < j和j < k的结果同为真或同为假,那么这个表达式的结果为真。

聪明的程序员有时会巧妙地利用关系运算符和判等运算符返回整数值这一事实。例如,依据i是小于、大于还是等于j,表达式(i >= j) + (i == j)的值分别是0、1、2。然而,这种技巧性编码通常不是一个好主意,因为这样会使程序难以阅读。

5.1.3 逻辑运算符

利用逻辑运算符(logical operator)与、或和非(见表5-3),较简单的表达式可以构建出更加复杂的逻辑表达式。!是一元运算符,&&和||是二元运算符。

表5-3 逻辑运算符

C语言入门:选择与循环语句功能介绍,一看就懂

逻辑运算符所产生的结果是0或1。操作数的值经常是0或1,但这不是必需的。逻辑运算符将任何非零值操作数作为真值来处理,同时将任何零值操作数作为假值来处理。

逻辑运算符的操作如下:

  • 如果表达式的值为0,那么!表达式的结果为1;
  • 如果表达式1和表达式2的值都是非零值,那么表达式1 && 表达式2的结果为1;
  • 如果表达式1或表达式2的值中任意一个是(或者两者都是)非零值,那么表达式1 || 表达式2的结果为1。

在所有其他情况下,这些运算符产生的结果都为0。

运算符&&和运算符||都对操作数进行“短路”计算。也就是说,这些运算符首先计算出左操作数的值,然后计算右操作数。如果表达式的值可以仅由左操作数的值推导出来,那么将不计算右操作数的值。思考下面的表达式:

(i != 0) && (j / i > 0)

为了得到此表达式的值,首先必须计算表达式(i != 0)的值。如果i不等于0,那么需要计算表达式(j / i > 0)的值,从而确定整个表达式的值为真还是为假。但是,如果i等于0,那么整个表达式的值一定为假,所以就不需要计算表达式(j / i > 0)的值了。短路计算的优势是显而易见的,如果没有短路计算,那么表达式的求值将导致除以零的运算。

C语言入门:选择与循环语句功能介绍,一看就懂 要注意逻辑表达式的副作用。有了运算符&&和运算符||的短路特性,操作数的副作用并不一定会发生。思考下面的表达式:

i > 0 && ++j > 0

虽然j因为表达式计算的副作用进行了自增操作,但并不总是这样。如果i > 0的结果为假,将不会计算表达式++j > 0,那么j也就不会进行自增。把表达式的条件变成++j > 0 && i > 0,就可以解决这种短路问题。或者更好的办法是单独对j进行自增操作。

运算符!的优先级和一元正负号的优先级相同,运算符&&和运算符||的优先级低于关系运算符和判等运算符。例如,表达式i < j && k == m等价于表达式(i < j) && (k == m)。运算符!是右结合的,而运算符&&和运算符||都是左结合的。

5.2 if语句

if语句允许程序通过测试表达式的值从两种选项中选择一种。if语句的最简单格式如下:

[if语句] if (表达式) 语句

注意,表达式两边的圆括号是必需的,它们是if语句的组成部分,而不是表达式的内容。还要注意,与在其他一些语言中的用法不同,单词then没有出现在圆括号的后边。

执行if语句时,先计算圆括号内表达式的值。如果表达式的值非零(C语言把非零值解释为真值),那么接着执行圆括号后边的语句。下面是一个示例:

if (line_num == MAX_LINES) line_num = 0;

如果条件line_num == MAX_LINES为真(有非零值),那么执行语句line_num = 0;。

C语言入门:选择与循环语句功能介绍,一看就懂 不要混淆==(判等)运算符和=(赋值)运算符。语句if (i == 0)...测试i是否等于0,而语句if (i = 0)...则是先把0赋值给i,然后测试赋值表达式的结果是否是非零值。在这种情况下,测试总是会失败的。

把==运算符与=运算符相混淆是最常见的C语言编程错误,这也许是因为=在数学(和其他许多编程语言)中意味着“等于”。C语言入门:选择与循环语句功能介绍,一看就懂 如果注意到通常应该出现运算符==的地方出现的是运算符=,有些编译器会给出警告。

通常,if语句中的表达式能判定变量是否落在某个数值范围内。例如,为了判定0≤i<n是否成立,可以写成

[惯用法] if (0 <= i && i < n)...

为了判定相反的情况(i在此数值范围之外),可以写成

[惯用法] if (i < 0 || i >= n)...

注意用运算符||代替运算符&&。

5.2.1 复合语句

注意,在if语句模板中,语句是一条语句而不是多条语句:

if (表达式语句

如果想用if语句处理两条或更多条语句,该怎么办呢?可以引入复合语句(compound statement)。复合语句由一对花括号,以及花括号内的声明和语句混合而成。可以有多个声明和多条语句,也可以都没有。在后一种情况下,复合语句只有一对花括号,它什么也不做。典型地,通过在一组语句周围放置花括号,可以强制编译器将其作为一条语句来处理。

下面是一个复合语句的示例:

{ line_num = 0; page_num++; }

为了表示清楚,通常将一条复合语句放在多行内,每行有一条语句,如下所示:

{ line_num = 0; page_num++; }

注意,每条内部语句仍然是以分号结尾的,但复合语句本身并不是。

下面是在if语句内部使用复合语句的形式:

if (line_num == MAX_LINES) { line_num = 0; page_num++; }

复合语句也常出现在循环和其他需要多条语句(但C语言的语法要求一条语句)的地方。

5.2.2 else子句

if语句可以有else子句:

[带有else子句的if语句] if (表达式) 语句 else 语句

如果圆括号内的表达式的值为0,那么就执行else后边的语句。

下面是一个含有else子句的if语句的示例:

if (i > j) max = i; else max = j;

注意,两条“内部”语句都是以分号结尾的。

if语句包含else子句时,出现了布局问题:应该把else放置在哪里呢?和前面的例子一样,许多C程序员把它和if对齐排列在语句的起始位置。内部语句通常采用缩进格式;但是,如果内部语句很短,可以把它们与if和else放置在同一行中:

if (i > j) max = i; else max = j;

C语言对可以出现在if语句内部的语句类型没有限制。事实上,在if语句内部嵌套其他if语句是非常普遍的。考虑下面的if语句,其功能是找出i、j和k中所存储的最大值并将其保存到max中:

if (i > j) if (i > k) max = i; else max = k; else if (j > k) max = j; else max = k;

if语句可以嵌套任意层。注意,把每个else同与它匹配的if对齐排列,这样做很容易辨别嵌套层次。如果发现嵌套仍然很混乱,那么不要犹豫,直接增加花括号就可以了:

if (i > j) { if (i > k) max = i; else max = k; } else { if (j > k) max = j; else max = k; }

为语句增加花括号(即使有时并不是必需的)就像在表达式中使用圆括号一样,这两种方法都可以使程序更加容易阅读,同时可以避免出现编译器不能像程序员一样去理解程序的问题。

有些程序员在if语句(以及重复语句)中尽可能多地使用花括号。遵循这种惯例的程序员为每个if子句和每个else子句都使用一对花括号:

if (i > j) { if (i > k){ max = i; } else { max = k; } } else { if (j > k) { max = j; } else { max = k; } }

即便在不必要的情况下也使用花括号,这样做有两个好处。首先,由于很容易添加更多的语句到任何if或else子句中,程序变得更容易修改;其次,这样做可以在向if或else子句中增加语句时避免由于忘记使用花括号而导致错误。

5.2.3 级联式if语句

编程时常常需要判定一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式”if语句常常是编写这类系列判定的最好方法。例如,下面这个级联式if语句用来判定n是小于0、等于0,还是大于0:

if (n < 0) printf("n is less than 0\n"); else if (n == 0) printf("n is equal to 0\n"); else printf("n is greater than 0\n");

虽然第二个if语句是嵌套在第一个if语句内部的,但是C语言程序员通常不会对它进行缩进,而是把每个else都与最初的if对齐:

if (n < 0) printf("n is less than 0\n"); else if (n == 0) printf("n is equal to 0\n"); else printf("n is greater than 0\n");

这样的安排带给级联式if语句独特的书写形式:

if (表达式) 语句 else if (表达式) 语句 ... else if (表达式) 语句 else 语句

当然,这种格式中的最后两行(else 语句)不是总出现的。这种缩进级联式if语句的方法避免了判定数量过多时过度缩进的问题。此外,这样也向读者证明了这组语句只是一连串的判定。

请记住,级联式if语句不是新的语句类型,它仅仅是普通的if语句,只是碰巧有另外一条if语句作为else子句(而且这条if语句又有另外一条if语句作为它自己的else子句,以此类推)。

程序 计算股票经纪人的佣金

当股票通过经纪人进行买卖时,经纪人的佣金往往根据股票交易额采用某种变化的比例进行计算。表5-4显示了实际支付给经纪人的费用金额。

表5-4 支付股票经纪人实际费用

C语言入门:选择与循环语句功能介绍,一看就懂

最低收费是39美元。下面的程序要求用户输入交易额,然后显示出佣金的数额:

Enter value of trade: 30000 Commission: $166.00

该程序的重点是用级联式if语句来确定交易额所在的数值范围。

broker.c

/* Calculates a broker"s commission */ #include <stdio.h> int main(void) { float commission, value; printf("Enter value of trade: "); scanf("%f", &value); if (value < 2500.00f) commission = 30.00f + .017f * value; else if (value < 6250.00f) commission = 56.00f + .0066f * value; else if (value < 20000.00f) commission = 76.00f + .0034f * value; else if (value < 50000.00f) commission = 100.00f + .0022f * value; else if (value < 500000.00f) commission = 155.00f + .0011f * value; else commission = 255.00f + .0009f * value; if (commission < 39.00f) commission = 39.00f; printf("Commission: $%.2f\n", commission); return 0; }

级联式if

相关内容

怎么学?如何干?西藏7市(地)委书记在西藏日报发表文章

启航新征程 开创新局面为全面建设社会主义现代化新拉萨努力奋斗自治区党委常委、拉萨市委书记 普布顿珠党的二十大大笔擘画坚持以中国式现代化全面推进中华民族伟大复兴的宏伟蓝图,区党委十届三次全会全面铺开建设美丽幸福西藏、共圆伟大复兴梦想的壮阔实践···

2023年全区智慧旅游专业人才培训班圆满结业

6月2日,自治区旅游发展厅主办的全区智慧旅游专业人才培训班在拉萨圆满结业。培训共历时三天,累计完成全区旅游行政管理部门工作人员及涉旅企业专业技术人员培训100人。本次培训是区旅发厅深入推进学习贯彻习近平新时代中国特色社会主义思想主题教育重要···

徐汇萨迦共同举办大美西藏首届口腔学习班

随着现代医学的发展,口腔健康越来越受到人们的关注,为提高西藏地区口腔技术水平和服务质量,近日,徐汇区牙病防治所和萨迦县中心医院远程连线共同举办首届口腔学习班开班仪式。徐汇区卫生健康委副主任胡强,上海援藏干部、萨迦县委常务副书记、常务副县长沈···

自觉抵制“一对一”“一对多”等学科类培训!哈尔滨中小学生暑期预警来了

17日,记者从哈尔滨市各区教育局获悉,2023年暑假将至,南岗区、道里区、香坊区教育局向家长发出预警,自觉抵制违规培训,各区义务教育阶段学科类培训机构已经全部注销,暑假期间以任何形式开展的学科类培训均属于违规培训。家长要自觉抵制任何机构或个···

哈尔滨市道里区企投局举办“招商大讲堂”专题培训

黑龙江网讯(记者 王惠婷)10月24日,哈尔滨市道里区企投局组织开展“招商大讲堂”专题培训班,全区各招商专班负责同志及业务骨干参加培训。本次培训从实际需求出发,紧紧围绕当前招商工作中的热点、难点,对“什么是招商引资”“道里区的产业结构和主导···

团黑龙江省委举办全省青年文明号青年岗位能手学习宣传贯彻党的二十大精神培训交流会

中国青年报客户端讯(李海涛)为深入学习贯彻党的二十大精神,充分发挥青年文明号、青年岗位能手示范引领作用,在全省职业青年中掀起学习党的二十大精神热潮,11月22日,团黑龙江省委举办全省青年文明号青年岗位能手学习宣传贯彻党的二十大精神培训交流会···

辽宁葫芦岛举办外贸政策培训会推动外贸保稳增量

辽宁省葫芦岛市外贸政策培训会4月3日举办。 辽宁省贸促会供图中新网葫芦岛4月3日电 (李晛)辽宁省葫芦岛市外贸政策培训会4月3日举办。本次活动由辽宁省贸促会支持、葫芦岛市商务局主办,葫芦岛市贸促会、葫芦岛海关、中国出口信用保险辽宁分公司和辽···

山西运城:严查无证校外培训机构 查封9家警告2家

新华社太原8月5日电(记者王飞航)记者从山西省运城市政府了解到,运城市教育局近日联合市公安局等多家单位,对中心城区无证校外培训机构进行了一次突击检查,共检查了13家校外培训机构,查封9家,警告2家,发放整改通知书4份。今年7月,运城市教育局···

山西开展培训筑牢森林“防火墙”

山西新闻网3月30日讯(记者 卢奕如)今日,记者从山西省应急管理厅获悉,全省举办森林草原防灭火业务培训,邀请专家以视频会议形式,围绕森林扑火指挥实操、森林草原火灾防控经验做法、火灾现场各级各类指挥员具体操作中遇到的问题等内容进行授课。培训内···

校外培训机构治理工作取得进展 山西停办近1300所

资料图:小学生排队等待进入校园。中新社记者 刘文华 摄中新网5月11日电 据教育部网站消息,按照校外培训机构专项治理工作整体安排,教育部、民政部、国家市场监管总局启动了校外培训机构治理专项督查工作。5月9日至10日,督查组率先在北京市开展华···

山西综改区举办省技术创新中心申报培训

  8月18日,山西综改区科技金融部举办2023年度省技术创新中心申报培训会,来自区内企业、科研院所及有关单位代表160余人参加了培训。  山西省技术创新中心是以产业前沿引领技术和关键共性技术研发为核心的产业技术创新平台,承担着为区域和产业···

山西汾阳医院开展健康教育与控烟知识培训

来源:【吕梁日报-吕梁新闻网】本报讯 (记者 刘少伟) 5月18日,在“世界无烟日”到来之际,山西汾阳医院组织开展健康教育与控烟知识培训。近年来,山西汾阳医院全面落实健康中国战略,根据国家卫健委《关于2011年起全国医疗卫生系统全面禁烟的决···

山西省文物局年度田野考古技术培训班开班

10月10日,山西省文物局在运城闻喜上郭城址、邱家庄墓群举办2023年度田野考古技术培训班开班仪式。该次培训为期三个月,通过理论和实践两部分教学,旨在推进山西考古工作高质量发展,提升考古业务人员专业技术水平。本次培训由山西省考古研究院和山西···

最低每课时9元!全省学科类校外培训课时长和收费标准出台

近日,山西省发改委、省教育厅下发《关于中小学学科类校外培训收费标准及有关事项的通知》,明确全省中小学学科类校外培训收费标准,从12月17日起执行。《通知》对全省线上线下学科类校外培训基准收费标准和浮动幅度制定了科学标准。其中,义务教育阶段线···

山西天镇 阳光职业培训学校培养乡村“新农人”乡村振兴添动能

(记者 贺文生) 山西天镇县阳光职业培训学校紧紧围绕乡村振兴战略,按照“政府引导、农民自愿、立足产业、突出重点”的原则,创新高素质农民技能培训方式方法,采取以“授人以渔”的方式,让人才振兴成为助推农业农村现代化的内生动力,以高素质农民引领现···

山西:建立全过程 全链条 无缝隙安全培训制度

黄河新闻网讯(记者杨江涛)日前,山西省应急管理厅下发了《山西省安全培训管理暂行办法》(以下简称《办法》)。我省将进一步抓好安全生产这个基本盘、基本面,推动全省安全培训工作制度化、规范化、科学化,促进安全培训工作高质量发展。山西省应急管理厅厅···

山西:艺考培训机构纳入全国监管平台管理

央广网太原10月6日消息(记者郎麒) 日前,山西省教育厅、省发改委、省公安厅等部门联合制定《加强面向高中阶段学生艺考培训规范管理工作方案》,针对艺考培训的突出特点和实际情况,全面规范艺考培训行为,将艺考培训机构统一纳入全国校外教育培训监管与···

太平财险阳泉中支开展消防安全教育和有限空间作业培训

为强化员工安全意识,进一步提升员工消防和有限空间突发事件应急处理能力,9月14日,太平财险阳泉中支邀请北京市卫民安消防教育咨询中心山西分中心讲师向全体员工开展了一次消防安全教育和有限空间作业课程培训。按照防消结合、预防为主的原则,本次讲座通···

山西省数字化转型贯标试点工作宣贯培训会在太原举行

  10月20日消息,山西省数字化转型贯标试点工作宣贯培训会在太原举行。省工信厅介绍,作为国家数字化转型贯标试点省份,试点启动后将引导企业加快数字化转型,助力制造业高端化、智能化、绿色化发展。  今年,工信部启动数字化转型贯标试点工作,我省···

山西马兰花创业培训讲师大赛收官 太原市获多个奖项

山西新闻网8月31日讯(记者 冯耿姝)8月29日,山西省第四届马兰花创业培训讲师大赛圆满收官,太原市代表队在比赛中分获多个二、三等奖和优秀奖。本届大赛以“启迪创新思维·激发创业梦想”为主题,全省共有56名教师晋级复赛,其中,太原市有7名选手···