目录
一、选择结构
1、c语言的选择语句(两种)
(1)if 语句:两个分支的选择结构(2)switch语句:多分支语句的选择结构。
(1)if 语句
(1) if 语句的一般格式:
if (判断表达式)
{
语句1;
}
else
{
语句2;
}
(2) 最简格式(没有else子语句):
if(判断表达式)
语句1
(3) 嵌套格式:
if(判断表达式1)
{
语句1
}
else if(判断表达式2)
{
语句2
}
.
.
.
else if(判断表达式n)
{
语句n
}
else
{
语句n+1
}
注意:
1、else必须伴随if来使用,而if不一定要伴随else 。
2、“语句1”、“语句2”……“语句n+1”中,这些语句可以是一行简单的语句,也可以是一个多行的复合语句,但要注意的是,若使用复合语句,则必须用大括号(“{ }”)括起来,若是单一条语句,则可以省略大括号。
3、当 if 的判断条件满足了,才会执行离 if 语句最近的语句,不满足则执行else或跳出if选择结构(最简格式的效果)。
4、if 嵌套时注意合理使用大括号,避免二义性的混淆。(else 总是与离它上面最近的 if 搭配)
例:if()
if()语句1
else
if()语句3
else 语句4
对上面的嵌套格式很容易让人产生误解,容易让人觉得第三行的else是与第一个if语句搭配,
但实际上第三行的else是与离它最近的"if()语句1 "【第二行的】这语句搭配的,
所以这些时候就容易产生二义性,从而产生bug。
所以若要实现,则需要合理借助大括号:
if()
{
if()语句1
}
else if()
{
语句3
}
else
{
语句4
}
(2) switch语句
(1)switch语句的格式:
switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
.
.
.
case 常量n:语句n
default: 语句n+1
}
举例说明:
实现输入成绩等级,输出对应的分数段
#include<stdio.h>
int main()
{
char grade;
scanf("%c",&grade);
printf("你的成绩所在百分制段为:");
switch(grade)
{
case'A':printf("85~100\n");break;
case'B':printf("70~84\n");break;
case'C':printf("60~69\n");break;
case'D':printf("<60\n");break;
default:printf("请确认输入是否有误\n");
}
return 0;
}
(2)switch 的使用分析注意事项(通过 上述代码 与 格式 进行分析)
- switch的执行方式:先执行switch语句后面的“表达式”,计算出表达式的值,然后与下面的case标号进行比较,比较得出结果执行对应的语句,若比较没有匹配成功的case,则执行default标号后的语句。
- switch后面接的“表达式”,其值的类型应为整型(包括字符型);
- switch语句体中可以有多个case,但最多只能有一个或没有default ,它们的作用都是起标志位置的作用;
- 若没有default,没有能与switch表达式相匹配的case常量,则不执行任何语句,直接跳出switch继续执行下一条语句;
- case后面跟一个常量或常量表达式,每个常量都必须互不相同,是要来与switch进行匹配,避免出现互相矛盾、二义性的现象。
- 标号出现的次序不影响执行的结果,如:可以先出现default标号,再出现case'D',然后再出现case'B',执行的结果都是一样的;
- case的常量与default这些标志位置之后要加冒号“ :”;
- 多个case标号可以共用一组执行语句,例如:
case'A': case'B': case'C':printf(">60\n");break;
标号A、B、C共用“ printf(">60\n");break; ”这一组执行语句(即:无论是A还是B还是C,都是使用该组语句)。
- 在case语句中,通常都会在最后加break进行跳出结束switch结构,但最后的一个case语句或default语句在最后时【注意:default跟case一样,若不是在最后,也是要加的】可以不加。若没有加,则会运行完对应的case标志的语句,然后接着继续运行它后面接着的所有case语句。
二、关系运算符
1、关系运算符及其优先次序
c语言提供有6种关系运算符(关系运算又叫比较运算)
(1)<、<=、>、>= 这四种优先级相同
(2)==(等于)、!=(不等于)这两种优先级相同
第(1)种的优先级高于第(2)种 。
与算术运算符、赋值运算符比较:算术运算符 > 关系运算符 > 赋值运算符
关系表达式:用关系运算符连接而形成的式子。值为一个逻辑值,即“真”或“假”。
三、逻辑运算符
1、逻辑运算符
逻辑运算符有3种:与、或、非
运算符 | 含义 | 举例 | 使用说明 |
---|---|---|---|
&& | 逻辑与 | a && b | 如果a和b都为真,则结果为真,否则为假。(一假则假,全真才真) |
|| | 逻辑或 | a || b | 如果a和b有一个以上为真,则结果为真,二者都为假时,结果才为假。(一真则真,全假才假) |
! | 逻辑非 | !a | 如果a为假,则 !a 为真,如果a为真,则 !a为假。(取反) |
2、优先级次序
优先级:!(非)> &&(与)> ||(或)
与算术运算符、关系运算符、赋值运算符比较:
!(非) > 算术运算符 > 关系运算符 > &&(与) > ||(或) > 赋值运算符
注意:
在逻辑表达式中,并不是所有的逻辑运算符都会被执行(逻辑的“短路”现象)
例如:(1)a && b && c 若当a为假,则不需要再判断 b 跟 c,因为此时已经可以确定结果必定为假,该现象称为“短路”现象。
3、逻辑型变量
定义逻辑变量用类型符_Bool(或bool),如:_Bool a,b;(或 bool a,b;)
在头文件 中,将 bool 定义为 _Bool 的同义词,同时定义了两个符号常量true和false,true代表1(真),false代表0(假),所有若程序里面有写 #include stdbool.h ,则可以直接使用bool(上面括号里面的样子)。
四、条件运算符
条件运算符:由两个符号组成的(:和?),要求有三个操作对象,称为三目运算符(或三元运算符)
条件表达式:表达式1 ?表达式2 :表达式3
执行的顺序:先求解表达式1,若表达式1为真,则执行表达式2,若表达式1为假,则执行表达式3
(相当于一组if……else……。 冒号【:】相当于if,问号【?】相当于else,表达式1是判断条件)
优先级:算术运算符 > 关系运算符 >条件运算符 > 赋值运算符,
如:max=(a>b)? a : b 等同于max = a>b ? a : b 先执行a>b,然后执行三目运算,最后赋值给max。
五、循环结构
循环结构:用于一些有规律、不断地多次执行处理的情况。
1、循环语句(3种)
(1)while语句(2)do……while语句 (3)for语句
(1)while语句
while语句的一般结构:
while(判断条件表达式)
{
循环体;
}
注意:
(1)当判断条件表达式符合条件为真时才执行循环体,否则跳出循环。
(2)while循环的特点:先判断条件表达式,后执行循环语句。
(2)do……while语句
do……while语句的一般结构:
do
{
循环体;
}
while(判断条件表达式)
注意:
(1)执行过程:先执行循环体,然后再判断条件是否满足成立,若成立再执行,不成立则跳出。
(2)do……while的特点:先执行后判断,无条件至少运行一次循环体。(这点就是与while的区别)
(3)for语句
for语句的一般结构:
for(循环变量赋初值;循环条件表达式;循环变量增值)
{
循环体;
}
// 循环变量赋初值:设置的初值可以没有,也可以是多个变量设置初值。
// 循环条件表达式:用来判断是否继续循环,在每次执行循环体前先判断再决定是否继续执行循环。
// 循环变量增值: 作用于改变循环变量的值,就如:i++、i--等,它是在执行完循环体后才执行的。
for语句的执行过程顺序:
1. 先给循环变量赋初值;
2. 判断循环条件表达式是否满足,若满足则执行循环体,然后执行下一步,若不满足则跳出for循环;
3. 执行循环变量增值改变循环变量的值;
4. 返回第2步继续运行。
注意:
for后括号里的三个表达式都可以省略,并且三者之间是用分号(;)隔开,无论有没有表达式在,那两个分号都必须在。
情况1:省略循环变量赋初值
例1:for( ; i<100 ; i++) 这个的i就是控制循环的变量,没有赋初值时,系统默认给它赋值为0。
*注意与上例1区分*
若代码为:
i=1;
for(;i<100;i++)
则此时 i 的初值就为1,i可以在for循环前进行赋值。
情况2:省略循环条件表达式
例2:for(i=0 ; ; i++)不设置循环的条件,此时循环会无休止的执行下去,判断条件默认为真。
情况3:省略循环变量增值
例1:for(i=0 ; i<100 ; )不设置循环变量增值,此时循环也是会无休止的执行下去,若是这样,要想使循环停止下来,则需要在循环体中设置增值或其他条件,这样才能使循环停止。
2、for语句与while语句的转换:(两者是等价的)
for语句: | while语句: |
for(循环变量赋初值;循环条件表达式;循环变量增值) { 循环体; } | 循环变量赋初值; while(循环条件表达式) { 循环体; 循环变量增值; } |
3、改变循环执行的状态
循环状态改变有两种:(1)正常的判断条件不满足跳出;(2)提前终止跳出。
提前终止跳出有两种:break语句 和 contiune语句。
(1)break语句
使用:break;
作用:提前结束循环,跳到循环体之外,执行循环外的下一行语句。(单层循环而言,终止整个循环)
注意:1、break语句只能用于 循环语句 和 switch语句 之中,而不能单独使用。
2、若是双重循环,break只是跳出内循环,而不是整个循环。(即:每个break只能跳出一层循环)
(2)continue语句
使用:continue;
作用:提前结束本次循环,执行下一次循环。(终止一次循环)