速通C语言——(分支和循环)
引言
总结了C语言中的分支结构(if、switch)和循环结构(for、while、do-while)
介绍了三目操作符,逻辑操作符和break、continue、goto语句
一、if语句
语法形式:
// 单分支
if (条件表达式) {
代码块;
}
// 双分支
if (条件表达式) {
代码块1;
} else {
代码块2;
}
// 多分支
if (条件1) {
代码块1;
} else if (条件2) {
代码块2;
} else {
默认代码块;
}
执行流程:
计算条件表达式;
若条件为真(非0),执行对应代码块;
若为假(0),跳过或执行 else 部分
注意:
如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
二、条件操作符(三目操作符)
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为假, exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp3 计算,计算的结果是整个表达式的结果。
三、逻辑操作符(&&, ||, !)
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下⾯三个运算符。
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
练习:闰年的判断:
判断闰年_牛客题霸_牛客网 (nowcoder.com)
https://www.nowcoder.com/practice/a7bcbe3cb86f435d9617dfdd20a16714?tpId=290&tqId=39843&ru=/exam/oj
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int year = 0; scanf("%d", &year); if (year % 4 == 0 && year % 100 != 0) printf("是闰年\n"); else if (year % 400 == 0) printf("是闰年\n"); else printf("不是闰年\n"); }
也可以写简洁一点:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int year = 0; scanf("%d", &year); if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) printf("是闰年\n"); else printf("不是闰年\n"); return 0; }
四、短路
C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
三、switch语句
switch (表达式) {
case 常量表达式1: 语句块1; break;
case 常量表达式2: 语句块2; break;
...
default: 语句块n;
}
上面代码中,根据表达式不同的值,执行相应的case分支。如果找不到就执行default 分支。
注:
1. switch 后面的表达式必须是整型表达式
2. case 后的值,必须是整形常量表达式
3. case 和后边的数字之间必须有空格
4. 每⼀个 case 语句中的代码执行完成后,需要加上break ,才能跳出这个switch语句。
在 switch 语句中 default 子句有要求顺序吗? default 只能放在最后吗?
case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实 际需求的就可以。 不过我们通常是把 default 子句放在最后处理的。
四、while循环
while(表达式(条件))
{
语句(循环体);
}
功能:条件为真时重复执行循环体。
执行流程:
1. 判断条件是否为真;
2. 若为真,执行循环体并返回步骤1;
3. 若为假,结束循环。
练习:在屏幕上打印1~100的值
while的实践
练习:在屏幕上打印1~100的值
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int i = 1; while (i <= 100) { printf("%d ", i); //i = i + 1; i++; } return 0; }
五、for循环
for 循环是三种循环中使用最多的,for 循环的语法形式如下:
for(表达式1;表达式2;表达式3)
{
语句;
}
表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
注意:表达式1,2,3可以不写东西,根据需要来设计
练习:在屏幕上打印1~100的值
练习:在屏幕上打印1~100的值
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int i = 1; for (i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
练习:计算1~100之间3的倍数的数字之和
练习:计算1~100之间3的倍数的数字之和
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int i = 0; int sum = 0; for (i = 1; i <= 100; i++) { if (i % 3 == 0) sum += i; //只有一个语句时,可以不写大括号 } printf("%d\n", sum); return 0; }
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { //优化 //如果能直接产⽣3的倍数的数字就省去了多余的循环和判断 int i = 0; int sum = 0; for (i = 3; i <= 100; i += 3) { sum += i; //只有一个语句时,可以不写大括号 } printf("%d\n", sum); return 0; }
六、do-while循环
在循环语句中do-while 语句的使用最少,它的语法如下:
do
{
语句(循环体);
}
while(表达式);
注意:
1. while后面有个分号
2. do-while循环会先执行一遍循环体,再进行判断,表达式为真,就会进行下一次,表达式为假,则不再继续循环体
练习:在屏幕上打印1~100的值
练习:在屏幕上打印1~100的值
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int i = 1; do { printf("%d ", i); i++; } while (i <= 100); return 0; }
练习:输入一个正整数,计算这个整数是几位数。
练习:输入一个正整数,计算这个整数是几位数。
例如:
输入:1234 输出 4
输入:12 输出:2
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; scanf("%d", &n); int cnt = 0; do { cnt++; n = n / 10; //可以删除最后一位 } while (n);//当n == 0时循环结束 printf("%d\n", cnt); return 0; }
这里并非必须使用do-while语句,但是这个代码比较适合使用do-while循环,因为n即使是0,也是一位数,要统计位数的。
七、break和continue语句
在循环执行的过程中,如果某些状况发⽣的时候,需要提前终止循环,这是非常常见的现象。
C语言中 提供了 break 和 continue 两个关键字,就是应用到循环中的。
• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。 • continue 的作用是跳过本次循环中continue后面的代码。
自己多敲代码多试试。
八、goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标记处。
例如:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
printf("hehe\n");
goto next; //next 就是跳转标号
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
直接跳过了打印haha的这段语句。
注意:goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以建议是能不用尽量不去使用;但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的方便了。
for (...)
{
for (...)
{
for (...)
{
if (...)
{
goto error;
}
}
}
}
error:
//....
本来 for 循环想提前退出得使用break ,⼀个 break 只能跳出一层for循环,如果3层循环嵌套就得使用3个break才能跳出循环,所以这种情况下使用goto语句就会更加快捷