ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Day5语法:循环-分支语句

Day5语法:循环-分支语句 目录1. 语句2. C 程序结构3. 分支语句3.1 if 语句3.1.1 形式一单分支 if3.1.2 形式二if-else3.1.3 形式三if-else if-else3.1.4 练习3.1.5 if 语句总结3.2 switch3.2.1 语法形式3.2.2 注意事项3.2.3 作业4. 循环语句4.1 简介4.2 goto 语句4.3 while 语句4.4 do-while 语句4.5 for 循环4.6 循环的嵌套4.7 break 和 continue1. 语句C 语言中语句指令就是表达程序员某个操作的意图。语句是 C 程序的基本执行单元它表示一个完整的操作每一条语句都是以;结束。语句可以分为单语句和复合语句。单语句常见形式赋值语句int a 10;函数调用语句printf(hello world\n);空语句;什么都不做复合语句是由一对花括号{}括起来的语句块代码块可以包含多个语句{ a 22; b a 13; c a b; // ...... }常见的流程控制语句包括if、switch、while、do while、for等。C 程序主体由函数组成函数内部由 C 语句组成。2. C 程序结构结构化程序设计提供三种控制结构顺序结构所有语句按照线性顺序执行。分支结构选择结构例如在 A、B 之间做出选择。循环结构重复执行指定的语句。早在 1966 年就已经证明以上三种基本结构可以构成任意复杂的算法。3. 分支语句分支结构选择结构用于在多个分支中做出选择。C 语言中的分支语句主要包括if语句和switch语句。3.1 if 语句if 语句用于条件判断满足条件时就执行指定的语句。if 语句有三种基本形式。3.1.1 形式一单分支 ifif(表达式) 语句如果“表达式”为真非 0表示条件成立则执行后面的“语句”。合法的表达式就一定会有值。常见的表达式有算术表达式a b逻辑表达式a b函数调用sum(a, b)if 条件成立时表达式的值为非 0if 条件不成立时表达式的值为 0。分析如下程序的结果示例 1int a 3, b 6; if(a b) a 4; // a b 结果为假此句没有执行 b 3; // 执行 printf(a:%d b:%d \n, a, b); // 输出a:3 b:3规则if 语句的作用域仅限于其后面的单条语句。如果希望多条语句被 if 管理可以使用{}指定if(a b) { a 4; b 3; }示例 2int a 4, b 3; if(a b); // 此处有分号 ; 代表一个空语句 a 5; printf(a: %d\n, a);编程建议为了避免上述混乱情况提高程序可读性建议不管 if 后面有没有语句都先加上{}确定范围if(xxx) { // 语句块; }3.1.2 形式二if-elseif(条件1) { 语句1 } else { 语句2 }假设条件 1 成立非 0则执行对应的语句 1否则执行语句 2。else 不能单独存在一定要和一个 if 匹配。练习从键盘获取用户输入的一个整数利用 if-else 语句判断其是否为偶数。if(n % 2 0) { printf(偶数\n); } else { printf(奇数\n); }3.1.3 形式三if-else if-elseif(条件1) { 语句1 } else if(条件2) { 语句2 } else if(条件3) { 语句3 } else { // 如果上述条件都不满足则执行此处 }这种结构适用于需要按优先级顺序逐个检查的情况。在每个条件后面跟随一个 else if只有在前一个条件为假时才会继续检查下一个条件如果所有的表达式都不成立则进入 else。示例根据学生成绩 score 打出对应的等级分。if(score 90) { printf(A\n); } else if(score 80) { printf(B\n); } else if(score 60) { printf(C\n); } else { printf(D\n); }用户输入 90 分时仅输出 A。各个条件按照优先级查找满足条件时执行对应的代码块。区别于以下写法if(score 90) { printf(A\n); } if(score 80) { printf(B\n); } if(score 60) { printf(C\n); } else { printf(D\n); }用户输入 90 分时A、B、C 都会输出。3.1.4 if 语句总结1. 并列条件与互斥条件// 并列条件 if(条件1) { ... } if(条件2) { ... } if(条件3) { ... } // 互斥条件 if(条件1) { ... } else { ... }2. if 语句的嵌套在某个大的条件下再细分条件。在 if 语句中包含一个或者多个 if称之为 if 嵌套。if(A) { if(C) { } else if(D) { } else { } } else { }注意 else 匹配原则else 总是与它上面最近的、同级的、未配对的 if 语句匹配。练习判断从键盘输入的内容是否为字母A~Z、a~z如果是小写字母则输出其大写如果是大写字母则输出其小写。提示ASCII 码虚拟机终端输入man ascii查看按 q 退出。scanf(%c, ch);用于获取输入。// 获取用户输入判断是否为字母 char ch; printf(请输入一个字母: ...\n); scanf(%c, ch); if((ch A ch Z) || (ch a ch z)) { printf(输入的字符是字母\n); // 进一步判断是大写还是小写 if(ch A ch Z) // 大写 { ch ch (a - A); // 大写转小写 printf(转换为小写: %c\n, ch); } else if(ch a ch z) { ch ch - (a - A); // 小写转大写 printf(转换为大写: %c\n, ch); } } else { printf(输入的字符不是字母\n); }3.2 switchswitch 用来列举表达式所有可能的情况并进行匹配。3.2.1 语法形式switch(表达式) { case 常量表达式1: 语句1 break; // 跳出 case 常量表达式2: 语句2 break; case 常量表达式m: 语句m break; default: // 建议将 default 写在最后 语句 break; }常量表达式是程序运行期间值不会改变的表达式。例如下面的 case 写法都是正确的#define N 122 switch(num) { case N: // define 在预处理阶段替换相当于 case 122: case 5: case A: case z: case 3 5: case a 32: break; }错误示例int a 3; switch(num) { case a 1: // 错误case 后不能使用变量 break; }switch 让“表达式”和 case 后面的“常量表达式”做匹配。一旦匹配成功值相等则从那个 case 后面开始执行直到遇到 break。如果所有的 case 都没有匹配成功则匹配 default。3.2.2 注意事项1. switch 后面的“表达式”必须是一个可以列举的值表达式的类型必须是整数值整型 int、字符型 char、枚举。int num; switch(num) { // ... }2. case 后面的“常量表达式”也必须是一个整数值不能是变量并且每个 case 后面的常量表达式的值必须不同。// 正确写法 switch(num) { case 1: break; case 2: break; } // 错误写法case 1 出现了两次 switch(num) { case 1: // AAAAA break; case 1: // BBBBB break; }3. 各个 case 和 default 出现的次序不影响匹配结果。一旦匹配成功就从此处往下执行直到遇到 break 或者 switch 语句结束。int a 5; switch(a) { // default 是所有 case 都不匹配时才会执行 default: ... case 1: ... case 2: ... case 5: a 20; // 匹配此处并执行 break; // 此处跳出 case 6: ... }4. “语句”可以省略多个 case 可以共用一组语句switch(a) { case 1: case 2: // a 为 1 或者 2 时都执行此处 ... case 3: ... }5. switch 中的 break 用来跳出它所属的 switch 语句switch(a) { case 1: case 2: ... case 3: break; default: ... }4. 循环语句先看一个场景通过程序实现求 12345...n 的和。int sum 0; // 用于保存累加的值 int n 1; // 要加的数 sum sum n; // 01 n; // 1--2 sum sum n; // 12 n; // ...... // 如果求到 n就需要重复执行 n 次 // ---- 循环4.1 简介循环的本质是重复。所有重复的代码都可以用循环来实现。在 C 程序中能够起到循环效果的语句如下if和goto构造循环while语句do while语句for语句其中if和goto并不算严格意义上的循环语句只是起到循环效果。4.2 goto 语句goto语句可以让 CPU 跳转到指定位置执行是一种无条件跳转语句。goto 行标识;“行标识”用于标识一行代码需要符合 C 语言标识符的命名规则由字母、数字、下划线组成不能以数字开头不能和关键字冲突。本质上它就代表了一个地址。loop: sum sum n; n; goto loop;通过 goto 实现十次循环打印 1-10int main() { int n 1; loop: printf(loop: n %d\n, n); n; if(n 10) { goto loop; } printf(loop end\n); return 0; }注意goto 类似于汇编代码的无条件跳转通常被认为是不好的编程风格会让代码难以调试和阅读因此平时尽量不要使用 goto 来做循环。4.3 while 语句while(表达式) { // 语句块 }当“表达式”的值为真非 0时执行“语句块”然后跳回 while 处继续判断如此重复直到“表达式”的值为假0为止。“表达式”可以是任意合法的 C 表达式只要有值。“语句块”是循环体是重复执行的部分可以是单语句也可以是复合语句。int sum 0; int i 1; while(i 100) sum i; i; // 此句不会参与循环编程建议不管 while 后面有没有语句都先加上大括号{}确定范围while(xxx) { // 要循环的内容 }练习 1逆序输出一个 3 位正整数。输入 123输出 321。int main() { int a 0; // 用于获取用户输入的数 int d 0; // 用于存储每一个位 printf(请输入一个三位的正整数\n); scanf(%d, a); // a 不为 0 则继续循环 while(a) { d a % 10; // 取出末位 printf(%d, d); // 打印末位 a a / 10; // 处理剩余位数 } return 0; }练习 2求 100 以内 3 的倍数的和。int main() { int n 1; // 表示 100 以内的某个数 int sum 0; // 用于累计它们的和 while(n 100) { if(n % 3 0) { sum n; } n; } printf(sum :%d\n, sum); return 0; }4.4 do-while 语句do // 语句 while(表达式);程序先执行“语句”然后再判断“表达式”的值。当值为真非 0时跳转到上面继续执行“语句”如此重复直到“表达式”的值为假0为止。翻译成 goto 语句loop: 语句 t 表达式; if(t) { goto loop; }示例int i 0; int sum 0; do i; sum i; while(i 100); printf(sum %d\n, sum);如果 do 后面不加花括号上述代码会报错error: expected ‘while’ before ‘sum’。应改成int i 0; int sum 0; do { i; sum i; } while(i 100); printf(sum %d\n, sum);编程建议使用 do-while 时先给 do 后打一对{}确定范围do { } while();while 和 do-while 的区别主要在于条件判断的时机while 在每次循环开始前判断do-while 在每次循环结束后判断。如果希望至少执行一次循环可以使用 do-while如果希望每次开始前先判断可以使用 while。特殊示例 do while(0)遇到复杂逻辑需要分步提前退出时可以尝试使用 do-while(0)。int a 0, b 0, c 0; // 用于存储边长 scanf(%d%d%d, a, b, c); do { if(a b c) { printf(no\n); break; } if(a c b) { printf(no\n); break; } if(b c a) { printf(no\n); break; } // 当上述任意一个条件不满足时会提前 break 退出 printf(最终: 满足三角形要求\n); } while(0);4.5 for 循环for(initialization; continuation; action) { statement; }其中 initialization 是初始化表达式用于初始化循环变量只执行一次continuation 是判断表达式只要为真就会不断执行循环体action 是循环变量处理表达式每轮循环结束后执行使得循环变量产生变化。更常见的形式for(表达式1; 表达式2; 表达式3) { 语句 }先执行一次表达式 1然后判断表达式 2 的值如果为真执行语句再执行表达式 3如此重复直到表达式 2 为假。三个表达式都可以省略但两个分号不能省略for( ; ; ) { // 如果表达式 2 省略表示 for 循环的执行条件永远为真 }for 和 while 的区别一般来说 while 更注重循环条件for 更注重循环次数两者可以互相替换。练习求“水仙花数”。水仙花数是三位数100-999且个位、十位、百位的立方和等于其本身。int x 100; int a, b, c; // 表示 x 的每一位 for(x 100; x 999; x) { a x % 10; // 个位 b (x / 10) % 10; // 十位 c x / 100 % 10; // 百位 if((a * a * a b * b * b c * c * c) x) { printf(找到水仙花数: %d\n, x); } }附C 中使用pow做幂运算double pow(double x, double y); int a 3; // 例如求 3 的 4 次方 printf(%.0f\n, pow((double)a, 4.0)); // 在 Ubuntu 中使用 gcc 编译时需要连接 -lm // gcc 1.c -lm4.6 循环的嵌套示例打印 3 行 6 列全为 0 的矩阵。for(int j 0; j 3; j) { for(int i 0; i 6; i) { printf(0 ); } printf(\n); }4.7 break 和 continuebreak跳出当前的循环或 switch 语句continue结束本次循环继续下一次循环。示例 1continueint i 10; int sum 0; while(i--) { if(i 5) { continue; sum i; // 不会执行到此处 } else { sum i; } } printf(sum %d\n, sum); // 54321示例 2breakint i 10; int sum 0; while(i--) { if(i 5) break; // 直接跳出整个 while 循环 else sum i; } printf(sum %d\n, sum); // 0
返回列表