C++篇 语 句

到目前为止,我们只见过两种语句: return 语句和表达式语句。根据语句对执行顺 序的影响,C 语言其余语句大多属于以下 3 大类。

  • 选择语句: if 语句和 switch 语句。
  • 循环语句: while 语句, do...while 语句和 for 语句。
  • 跳转语句: break 语句, continue 语句和 goto 语句 ( return 语句也属于此类)。
  • 复合语句 (把几条语句组合成一条语句)。
  • 空语句 (不执行任何操作)。

一、选择语句

if 语句
if 语句最简单的格式为:

if (expr) statement

比如下面这个示例:

if (line_num == MAXLINES)line_num = 0;

注意: 不要混淆 == 和 =。语句 if (i == 0) ... 测试 i 是否等于 0;而语句 if (i = 0) ... 则是先把 0 赋值给 i,然后测试赋值表达式的值是否非零,在这种情况下,测试总 是失败的。

复合语句  
如果我们想用 if 语句控制两条或者更多条语句,该怎么办呢?这时,就需要引入复合语句了。复合语句格式如下:

{ statements }

通过将多条语句用花括号括起来,可以强制编译器将其作为一条语句来处理。如:

{line_num = 0;page_num++;
}

这样,我们就可以在 if 语句中使用复合语句了:

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

e l s e 子句
if 语句还可以有 else 子句,其格式为:

if (expr) statement 
else statement

如果 expr 的值为 0,那么就执行 else 子句。如:

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

C 语言对 if 语句内部的语句没有任何限制。事实上,在 if 语句内部嵌套其他 if 语句是非常普遍的。比如,我们可以用下面的语句找出 i, j, k 中的最大值:

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

级联式 if 语句
写程序时,我们经常需要判定一系列条件,直到某个条件为真。级联式 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 语句内部的,但 C 程序员通常不会像上面一 样对第二个 if 语句进行缩进,而是写成下面这样:

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

因此,级联式 if 语句有自己独特的书写形式:

if (expr)statement
else if (expr)statement
...
else if (expr)statement
elsestatement

级联式 if 语句不是新的语句类型。它仅仅是普通的 if 语句,只是碰巧它 的 else 子句又是一条新的 if 语句,以此类推...

悬空 e l s e 问题:
当 if 语句嵌套时,我们需要当心臭名昭著的"悬空 else"问题。思考下面这个例子:

#include<iostream>
#define SIZE(a) (sizeof(a) / sizeof(a[0]))using namespace std;int main(){
int x = 10, y = 0, result;	
if (y != 0)if (x != 0)result = x / y;
else printf("Error: y is equal to 0\n");return 0;
}

上面 else 子句究竟属于哪一个 if 语句呢?缩进暗示它属于最外层的 if 语句。然 而 C 语言遵循的规则是 else 子句应该属于离它最近的,且还没有和其他 else 匹配 的 if 语句。因此,在这个例子中, else 子句属于内层的 if 语句。
为了使 else 子句属于外层的 if 语句,我们可以用花括号将内层的 if 语句括起 来:
 

if (y != 0) {if (x != 0)result = x / y;
} elseprintf("Error: y is equal to 0\n");

条件表达式
C 语言提供了一种特殊的运算符——条件运算符,这种运算符可以根据条件产生两个 值中的一个。条件运算符由 ? 和 : 组成,其格式如下:
 

expr1 ? expr2 : expr3

条件运算符是 C 语言中唯一一个有 3 个操作数的运算符,因此我们又把它称为三目运算符。 条件表达式的求值步骤是:首先计算 expr1 的值,如果该值不为 0,则计算 expr2 的 值,并且把 expr2 的值当作整个表达式的值;如果 expr1 的值为 0,那么计算 expr3 的值,并把 expr3 的值当作整个表达式的值。 请看下面的示例:

int i, j, k;
i = 1;
j = 2;
k = i > j ? i : j;
k = i > j ? i++ : j++;
k = (i >= 0 ? i : 0) + j;

顺便说以下,最后一条语句的圆括号是必须的,因为三目运算符的优先级只比赋值运算符的优先级高一点。

布尔值 

bool flag = true;

switch 语句
在日常编程中,常常需要把表达式和一些列值进行比较,从中找出匹配的值。前面可 以看到,级联式 if 语句可以可以达到这个目的。

if (grade == 4)printf("Excellent");
else if (grade == 3)printf("Good");
else if (grade == 2)printf("Average");
else if (grade == 1)printf("Poor");
else if (grade == 0)printf("Failing");
else printf("Illegal grade");

C 语言提供了 switch 语句作为这类级联式 if 语句的替换。如上面的例子可以写成 这样:

switch (grade) {
case 4: printf("Excellent");break;
case 3: printf("Good");break;
case 2: printf("Average");break;
case 1: printf("Poor");break;
case 0: printf("Failing");break;
default:printf("Illegal grade");break;
}

switch 语句往往比级联式 if 语句更容易阅读。此外,switch 语句的执行速度也会比 if 语句快一些。

switch 语句相对来说比较复杂,下面我们来看以下它的组成成分:

控制表达式。 switch 后边表达式的值必须是整数类型。C 语言把字符类型也当作整 数来处理,因此 switch 语句也可以对字符类型进行判定。但是,不能判定浮点数和字符串 (why?)。
分支标号。 case 后边必须跟常量表达式,并且常量表达式的值必须是整数(字符类型也可以)。 常量表达式:即能够在编译期间求值的表达式。
语句。每个 case 后面可以跟任意数量的语句 (不需要用花括号括起来)。每组语句的 最后通常是一条 break 语句。
注意switch语句不能进行范围比较,switch语句在C 语言中不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一 定要放到最后。而且 switch 语句不要求一定要有 default 分支。如果 default 不存在, 而且控制表达式的值和任何一个分支标号都不匹配,控制会直接传递给 switch 后面的语句。  
多个分支标号,可以共用一组语句。如:

switch (grade) {
case 4: case 3: case 2: case 1: printf("Passing");break;
case 0: printf("Failing");break;
default:printf("Illegal grade");break;
}

case 穿透(/*break through*/)

switch (grade) {
case 4: printf("Excellent");
case 3: printf("Good");
case 2: printf("Average");
case 1: printf("Poor");
case 0: printf("Failing");
default:printf("Illegal grade");
}

【练】利用 switch 语句编写一个程序,把用数字表示的成绩转化为字母表示的等级。 评定规则为: A为 90~100,B为 80~89,C为 70~79,D 为 60~69,F 为 0~59。如果成 绩高于100或者低于0,则显示出错消息。

二、循环语句

C 语言提供了 3 种循环语句,即while语句,do...while语句和for语句。while语句在循环体执行之前测试控制表达式,do...while循环在循环体执行之后测试控制表达式,for语句则非常适合那些递增或递减计数变量的循环。
while 语句

i = 10;
while (i > 0) {    
printf("Counting down: %d\n", i);    
i--;}

如果控制表达式的值始终非零,那么while语句将永远执行下去。事实上,有时候我们会故意用非零的常量表达式作为控制表达式,以此来构造无限循环。

/* idiom */
while (1) ...

除非循环体内含有跳出循环的控制语句 (break, goto, return) 或者调用了导致程序终止的函数,否则上述形式的while语句将永远执行下去。

do...while 语句

do...while语句和while语句关系紧密。事实上,do...while语句本质上就是while语句,只不过其控制表达式是在每次执行完循环体之后进行判定的。do...while语句的格式如下:

do statement while (expr) ;

执行do...while语句时,先执行循环体,再计算控制表达式的值。如果表达式的值非零,那么继续执行循环体,然后再计算表达式的值;如果表达式的值为零,则终止do...while语句的执行。如:

i = 10;
do {printf("Counting down: %d\n"; i);i--;
} while (i > 0);

do...while 语句和 while 语句的唯一区别是:do...while 语句的循环体至少会执行一次,而 while 语句在控制表达式的值初始为 0 时,一次都不会执行。

 for 语句

现在介绍 C 语言中最后一种循环,也是功能最强大的一种循环:for语句。for语句非常适合那些递增或递减计数变量的循环,当然它也可以灵活地应用在许多其他类型的循环中。for语句的格式如下:

​​​​​​​for (expr1; expr2; expr3) statement
for(i = 10; i > 0; i--)    printf("Counting down: %d\n"; i);

省略 for 语句中的表达式
for 语句远比现在看到的更加灵活,C 语言允许 for 语句省略一些或者是全部的表达式。
如果省略 expr1,那么在执行循环前没有初始化的操作:

i = 10;
for (; i > 0; --i)	printf("Counting down: %d\n", i);

如果省略 expr3,那么循环体需要确保 expr2 的值最终会变成 0:

for (i = 10; i > 0; )    printf("Counting down: %d\n", i--);

当同时省略 expr1 和 expr3 时,那么for语句和while语句就没有任何分别,如:

i = 10;
for (; i > 0; )    printf("Counting down: %d\n", i--);

等价于

i = 10;
while (i > 0)    printf("Counting down: %d\n", i--);

在 C99 中,for语句的第一个表达式可以替换为一个声明,这一特性使得程序员可以声明一个用于循环的变量:

for (int i = 0; i < n; i++)    ...

变量 i 不需要在该语句前进行声明。如果变量 i 在之前已经进行了声明,这个语句将创建一个新的 i,且该变量只能在循环内使用。for语句声明的变量在循环外是不可见的:

for (int i = 0; i < n; i++) 
{    ...    printf("%d", i);   /* legal */    ...
}
printf("%d", i);     /* Wrong */

顺便提一下,for 语句可以声明多个变量,只要它们的类型相同:

for (int i = 0, j = 0; i < n; i++)    ...

逗号表达式
逗号表达式的求值分为两步:第一步,计算 expr1 并且扔掉计算出的值;第二步,计算 expr2,把这个值作为整个表达式的值。对 expr1 的计算应该产生一些副作用,否则 expr1 就没有存在的必要了。举个例子:
逗号表达式是左结合的,因此编译器会把表达式

i = 1, j = 2, k = i + j

解释为 (i = 1, j = 2), k = i + j
C 语言之所以提供逗号运算符,是为了在只能有一个表达式的地方可以使用两个甚至是多个表达式。换句话说,逗号运算符允许将两个表达式"粘"在一起,构成一个表达式 (和复合语句类似,复合语句可以把一组语句当成一条语句来使用)。

for (sum = 0, i = 1; i <= N; i++)    sum += i;

三、跳转语句

break

switch, while, do...while 和 for 语句。但是当这些语句嵌套时,break只能跳出包含break语句的最内层嵌套。

continue​​​​​​​

break 语句会把控制转移到整个循环的后面,而 continue 会将控制转移到循环体的末尾。break 语句会跳出循环,而 continue 语句仍然留在循环体内。break 语句和continue 语句还有另外一个区别:break 语句可以用于 switch 语句和循环,而continue 只能用于循环。

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XSS漏洞-存储型漏洞案例

一、环境 在github上找DVWA的靶机环境 DVWA存储库 二、复现 先将其安全等级改为低 然后点击存储型的xss&#xff0c;先随便写几条看看现象 可以看到我们写的都展示在了下面的框中 看看源码&#xff0c;分析在存储时的漏洞 我们可以看到&#xff0c;在对数据插入的时候&am…

01_04_JavaWEB01_HTMLCSS

一 HTML入门 参考尚硅谷再总结复习 1.1 HTML&CSS&JavaScript的作用 HTML 主要用于网页主体结构的搭建 CSS 主要用于页面元素美化 JavaScript 主要用于页面元素的动态处理 1.2 什么是HTML HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭…

筛选出等于1的式子

然后统计和归类 归类分行归类方法 算术符号归类 数字大小排序算术符号归类 import randomdef generate_expression(num_range, num_count, operators):nums random.sample(range(num_range[0], num_range[1]1), num_count)ops random.choices(operators, knum_count-1)expre…

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling ChatGPT结合实际业务&#xff0c;主要是研发多函数调用&#xff08;Function Calling&#xff09;功能模块&#xff0c;将自定义函数通过ChatGPT 问答结果&#xff0c;实现对应函数执行&#xff0c;再次将结果…

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…

强引用、软引用、弱引用、幻象引用 —— Java的四种引用类型解析

强引用、软引用、弱引用、幻象引用 —— Java的四种引用类型解析 在Java中&#xff0c;对象的生命周期并不总是由我们直接控制。除了我们常见的强引用外&#xff0c;Java还提供了软引用、弱引用和幻象引用这三种引用类型&#xff0c;它们对对象生命周期的影响各不相同。理解这…

一步到位!快速精通Git工作流及实战技巧详解

Git是一个分布式版本控制系统。 1、git的应用场景 1.备份 小明负责的模块就要完成了&#xff0c;就在即将release之前的一瞬间&#xff0c;电脑突然蓝屏。硬盘光荣牺牲&#xff01;几个月来的努力付之东流。 场景二&#xff1a;代码还原 这个项目中需要一个很复杂的功能&…

Linux下使用MD5SUM命令详解

在Linux操作系统中&#xff0c;md5sum是一个非常实用的工具&#xff0c;用于生成和校验文件的MD5散列值。MD5是一种广泛使用的密码散列函数&#xff0c;可以产生一个128位&#xff08;16字节&#xff09;的散列值&#xff0c;常用来确保数据的完整性和一致性。 一、MD5SUM命令…

【Java】<Java类库> 与 <Java标准库>

Java标准库 和 Java类库 在某种程度上是相互关联的概念&#xff0c;但它们又有一些不同之处。 Java标准库&#xff1a; Java标准库是指Java平台提供的一组标准的类和接口的集合&#xff0c;用于实现Java程序的基本功能和常见任务。Java标准库是Java平台的一部分&#xff0c;包含…

CVHub | 初识langchain,3分钟快速了解!

本文来源公众号“CVHub”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;初识langchain 1 什么是langchain langchain[1]是一个用于构建LLM-Based应用的框架&#xff0c;提供以下能力: 上下文感知&#xff1a;可以为LLM链接上下文…

《Python源码剖析》之字符串拼接的一个效率问题

前言 我们常用的字符串拼接方法有两个&#xff0c;一个是通过“”号实现字符串的拼接&#xff0c;还一个就是通过join方法来实现拼接&#xff0c;前者在写法上更加便利&#xff0c;和数字之间的加法运算一样&#xff0c;通常只有两个运算对象&#xff0c;只不过他们的运算规则…

XS2186 PSE控制器产品-八通道,兼容IEEE 802.3at/af

XS2186 PSE控制器产品-八通道&#xff0c;兼容IEEE 802.3at/af 芯片特性&#xff1a; 八通道&#xff0c;兼容IEEE 802.3at/af 0.1Ω内置电流检测电阻 内置电源功率管 每个端口高达30W 10位端口电流和电压实时监测 兼容I2C&#xff0c;3线串口 支持独立供电操作 为遗…

新贵Claude 3家族强势登场,AI领域掀起新一轮浪潮!

人工智能领域的风云再起,Anthropic公司日前放出狠招,推出了全新的大模型家族Claude 3系列。Claude 3由三款不同级别的大模型组成,分别是Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。这一系列产品的推出,不仅扩充了AI生态,更是对OpenAI的GPT-4等龙头产品发出了挑战。让我们…

函数柯里化:JavaScript中的高级技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

利用GPT开发应用005:Codex、Turbo、ChatGPT、GPT-4

文章目录 一、GPT-3 Codex二、GPT-3.5 Turbo二、ChatGPT三、GPT-4 一、GPT-3 Codex 2022年3月&#xff0c;OpenAI 发布了 GPT-3 Codex 的新版本。 这个新模型具有编辑和插入文本的能力。它们是通过截至 2021 年 6 月的数据进行训练的&#xff0c;并被描述为比之前版本更强大。到…

力扣爆刷第88天之hot100五连刷26-30

力扣爆刷第88天之hot100五连刷26-30 文章目录 力扣爆刷第88天之hot100五连刷26-30一、142. 环形链表 II二、21. 合并两个有序链表三、2. 两数相加四、19. 删除链表的倒数第 N 个结点五、24. 两两交换链表中的节点 一、142. 环形链表 II 题目链接&#xff1a;https://leetcode.…

ospf静态路由实验简述

1、ospf静态路由实验简述 实验拓扑图 实验命令 r2: sys sysname r2 undo info enable int loopb 0 ip add 2.2.2.2 32 quit int e0/0/0 ip add 23.1.1.2 24 quit ospf 1 area 0 network 23.1.1.0 0.0.0.255 network 2.2.2.2 0.0.0.0 ret r3: sys sysname r3 undo info enable …

C++vector简单实现

由于我们之前已经详细讲解了string接口&#xff0c;而vector接口大都在string上有&#xff0c;所以大家只需自行翻阅前面文章就可以明白接口的使用了&#xff0c;所以&#xff0c;这里我们只实现vector&#xff0c;注意&#xff1a;vector会有迭代器失效的情况&#xff0c;大家…

SuperNIC:用于人工智能的网络加速器

随着人工智能的复杂性和规模不断增长&#xff0c;传统的网络解决方案往往无法满足这些先进系统的数据密集型需求。为了解决人工智能工作负载所面临的问题&#xff0c;SuperNIC应运而生。在本文中&#xff0c;我们将探讨SuperNIC的变革能力&#xff0c;探索它如何革新网络性能&a…

C语言经典算法题-2

文章目录 11.字串核对12.双色、三色河内塔13.背包问题&#xff08;Knapsack Problem&#xff09;14.蒙地卡罗法求 PI15.Eratosthenes筛选求质数 11.字串核对 说明&#xff1a;今日的一些高阶程式语言对于字串的处理支援越来越强大&#xff08;例如Java、Perl等&#xff09;&am…