前言:
C语言是结构化的程序设计语言。这里的结构是指:顺序结构、选择结构、循环结构。
我们可以使用if、switch实现分支结构;使用for、while、do while实现循环结构。
if语句
语法形式
if(表达式)
语句
表达式为真,则语句执行;表达式为假,则语句不执行。在C语言中,零为假,非零表示真。
else语句
当表达式为假时,就执行语句2
语法形式
if(表达式)
语句1
else
语句2
嵌套if else语句
直接上例子
//输入一个人的年龄,然后分区间打印不同的结果。
//按照最初始的理论我们应该会写出如下代码
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else
{
if (age <= 44)
{
printf("青年");
}
else
{
if (age < 90)
{
printf("老年");
}
else
printf("老寿星");
}
}
return 0;
我们会发现如果这样写,我们的程序就很乱,不够简洁。
所以我们改写为:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else if (age <= 44) //注意这里我们不用age>=18 && age<=44岁来表示,在这里默认为age>=18
printf("青年");
else if (age < 90)
printf("老年");
else
printf("老寿星");
return 0;
}
悬空else问题
else总是跟最接近的且未匹配的if语句匹配
直接看例题:
#include<stdio.h>
int main()
{
int a = 0, b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
宝子们思考觉得它会输出什么结果?其实什么都不输出。
这里的缩进有错误,但如果把这段代码拷贝到vs上,vs会自动改变缩进,所以说缩进格式很重要
其实是这样的:
-
#include<stdio.h> int main() { int a = 0, b = 2; if (a == 1) { if (b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
如果确实是想要else和第一个if匹配的话,可以合理的利用大括号
关系操作符
- 关系表达式中的运算符就称为关系运算符
- 关系表达式的返回值通常为0或1,表示真假
- 相等运算符== 与 赋值运算符=是两个不同的运算符,不要混淆了
-
为了防止这种错误,可以写成 if(3==a) 这样的话,即使写错了也会报错:“表达式必须是可修改的左值”
- 多个关系运算符不宜连用
-
i<j<k 这个表达式表达的意思为: I小于J返回0或1,所以最终是0或1与变量K进行比较 即 (i<j)<k
条件操作符
条件操作符也叫做三目操作符,因为有三个操作数,形式如下
exp1 ? exp2 : exp3
他的计算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果 ; 如果exp1为假,exp3计算,计算的结果则是整个表达式的结果
看段代码吧
//输出两数之间的最大者
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a,& b);
int m = a > b ? a : b;
printf("%d", m);
return 0;
}
逻辑操作符或与非
- | | 或运算符:有真则真
- && 与运算符:有假则假
- ! 取反运算符:改变单个表达式的真假
看个例题就明白啦
//闰年的判断。闰年:能被4整除并且不能被100整除或者能被400整除
int main() {
int year;
printf("请输入年份:");
scanf("%d", &year);
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
{
printf("%d是闰年。\n", year);
}
else
{
printf("%d不是闰年。\n", year);
}
return 0;
}
短路情况
- 这个考点经常考
- C语言逻辑运算符有一个特点,他总是先对左侧的表达式求值,再对右侧的表达式求值这个顺序是一定的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况就称为“短路”。
-
if(month >= 3 && month <= 5) &&运算符是有假则假的 如果&&的左操作数的结果为0时,右边操作数就不再执行 if(month ==11 || month==1 || month ==3) ||运算符是有真则真的 如果第一个表达式month==11为1时,那么右边的操作数都不再执行 这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值
- 请思考下面的题目
#include<stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);
return 0;
}
//请问输出的是什么
switch语句
- 除了if语句之外,C语言还提供了switch语句来实现分支结构
- switch语句是一种特殊的if else语句,用与判断题条件有多个结果的情况。
-
基本形式 switch (expression) { case value1:statement case value2:statement default:statement }
- 注意这个expression必须是整型表达式
- 注意:字符也是整型表达式,存字符存的是他的ASCII值所以也算
- default语句的顺序不重要,后面也要加break语句
- case后必须是整型常量表达式,且必须要有个空格
- 注意别漏了break语句
-
#include<stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n % 3) { case 0: printf("整数,余数为0."); break; case 1: printf("余数为1"); break; case 2: printf("余数为2"); break; } return 0; }
- 如果没有break;语句会怎样呢?
-
#include<stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n % 3) { case 0: printf("整数,余数为0\n"); case 1: printf("余数为1\n"); break; case 2: printf("余数为2\n"); break; } return 0; } //输出 6 整数,余数为0 余数为1
while循环
-
//语法形式 while(表达式) 语句
for循环
-
//语法形式 for(表达式1;表达式2;表达式3) 表达式1:用于循环变量的初始化 表达式2:用于循环结束条件的判断 表达式3:用于循环变量的调整
do while循环
-
//语法形式 do 语句; while(表达式); //注意这个;不能省掉
- while和for循环这两种循环都是先判断再进行循环
- 而do while循环则是先进入循环体执行循环语句再判断表达式
- 所以do while语句至少执行循环一次
break和continue语句
- 在循环执行的过程中如果某些状况发生的时候,需要提前终止循环,这是非常常见的情况。 C语言中提供了break和continue两个关键字,就是应该到循环中的。
- break的作用是终止整个循环
- continue的作用是结束本次循环,继续下一次循环,在for循环和while循环中是有所差异的
- 我们要搞清楚while循环中的break语句、 for循环中的break语句、 while循环中的continue语句、for循环中的continue语句。下面的代码很好地解释了其中的不同点
-
//break举例 1、while循环的break语句 #include<stdio.h> int main() { int i = 1; while (i <= 10) { if (i == 5) break; //整个循环终止 printf("%d", i); i = i + 1; } return 0; } //输出结果:1 2 3 4 2、for循环中的break语句 #include<stdio.h> int main() { for (int i = 0; i < 10; i++) { if (i == 5) break; //跳出整个for循环 printf("%d", i); } return 0; } //输出结果01234
-
//continue举例 1、for循环中的continue #include<stdio.h> int main() { for (int i = 0; i < 10; i++) { if (i == 5) continue; //结束本次循环,继续之后的循环 printf("%d", i); } return 0; } //输出结果012346789 就是没有5 2、while循环中的continue #include<stdio.h> int main() { int i = 1; while (i <= 10) { if (i == 5) continue; 当i=5时,就执行continue,直接跳过continue后面的代码,去循环判断的地方 所以i一直为5,程序陷入死循环 所以输出结果依旧是1234 printf("%d", i); i = i + 1; } return 0; } //输出结果还是:1 2 3 4
goto语句
- goto语句可以实现在同一个函数内跳转到设置好的标号处
- 在多层循环的代码中,如果想要快速跳出循环使用go to就非常方便
-
for (......) { for (........) { for (........) { for (........) { for (........) { goto error; } } } } } } } } error:
-
例子 #include<stdio.h> int main() { printf("hehe\n"); goto next; printf("你猜我这条会不会打印出来?\n"); next: { printf("你看上面的hehe\n"); } return 0; } 打印结果: hehe 你看上面的hehe