前言
从本节开始,将进入C语言循环分支结构,在学习过程中,需要多敲代码,多刷题。
下面是来自牛客竞赛的小白题,学习完本节,可以进行相应的练习:
选择结构程序设计
一、if 语句
1.1 基本 if 语句
if(条件表达式){ //语句 }
条件表达式为真,就执行语句;条件表达式为假,就不执行语句。通俗易懂!
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果是不是0,则语句执⾏。
#include <stdio.h> int main(){ int a; //定义一个int型变量a scanf("%d", &a); //读入a的值 if(a != 0){ //如果a的值不为0 printf("%d\n", a); //输出a的值并输出一个回车 } //若a的值为0,则不会执行任何内容,程序正常退出 return 0; }
1.2 else 语句
if ( 表达式 ) 语句1 else 语句2
举个例子:
#include <stdio.h> int main(){ int a; //定义一个int型变量a scanf("%d", &a); //读入a的值 if(a != 0){ //如果a的值不为0 printf("%d\n", a); //输出a的值并输出一个回车 } else{ printf("a的值为0!\n"); //若a的值为0,输出"a的值为0!"并输出一个回车 } return 0; }
1.3 else if 语句
if(条件表达式1){ //语句1 } else if(条件表达式2){ //语句2 } else{ //语句3 }
举个例子:
#include <stdio.h> int main(){ int a; //定义一个int型变量a scanf("%d", &a); //读入a的值 if(a > 100){ //如果a的值大于100 printf("%d\n", a - 100); //输出a - 100的值并输出一个回车 } else if(a > 0 && a <= 100){ //如果a的值大于0且a的值小于等于100 printf("%d\n", a + 100); //输出a + 100的值并输出一个回车 } else if(a == 0){ //若a的值为0 printf("a的值为0!\n"); //输出"a的值为0!"并输出一个回车 } else{ printf("a的值为小于0!\n"); //若a的值不满足以上所有条件,输出"a的值小于0!"并输出一个回车 } return 0; }
1.4 嵌套 if 语句
在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
#include <stdio.h> int main(){ int a; //定义一个int型变量a scanf("%d", &a); //读入a的值 if(a > 0){ if(a > 100){ //如果a的值大于100 printf("%d\n", a - 100); //输出a - 100的值并输出一个回车 } else{ printf("%d\n", a + 100); //输出a + 100的值并输出一个回车 } } else if(a == 0){ //若a的值为0 printf("a的值为0!\n"); //输出"a的值为0!"并输出一个回车 } else{ printf("a的值为小于0!\n"); //若a的值不满足以上所有条件,输出"a的值小于0!"并输出一个回车 } return 0; }
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。
1.5 else 悬空问题
如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。
如果我们希望else确实和第⼀个if匹配,可以这样修改代码:
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) { if(b == 2) printf("hehe\n"); } else { printf("haha\n"); } return 0; }
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。
二、关系操作符
• > ⼤于运算符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符关系表达式常⽤于 if 或 while 结构。
注意,相等运算符与赋值运算符 = 是两个不⼀样的运算符,不要混淆。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
三、逻辑操作符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。注:C语⾔中,⾮0表⽰真,0表⽰假
逻辑取反运算符
⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:
if(!flag) { printf("do something\n"); }
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。
四、switch 语句
4.1 作用
执行多条件分支语句。
4.2 语法
switch(expression){ case value1:执行语句1; break; case value2:执行语句2; break; ... default: 执行语句n; break; }
注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式•case 和后边的数字之间必须有空格
•每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
4.3 switch语句中的case和default的顺序问题
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。