目录
分支语句与循环语句
分支语句
- if
- switch
循环语句
- while
- for
- do while
goto语句
1.语句类别
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
2. 分支语句(选择语句)
2.1 if语句
if语句的语法结构:
if(representation)
statement1; 这里只有一个,若语句比较多需要加大括号,一对括号就是一个代码块
else
statement2;
多分支:
if(representation1)
statement1;
else if(representation2)
statement2;
else
statement3;
ex:
#include<stdio.h>
int main()
{
int line = 0;
while (line<=20000)
{
printf("敲代码: %d\n", line);
line++;
}
if (line > 20000)
printf("好offer\n");
else
printf("好好学习,天天编程\n");
return 0;
}
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 16)
printf("少年\n");
else if (age >= 16 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 40)
printf("中年\n");
else if (age >= 40 && age < 56)
printf("壮年\n");
else if (age >= 56 && age < 80)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
&&表示并且,不能写成18<=age<30
这样写会先判断18<=age为假,即为0<30即为真
如果表达式representation结果为真,则语句执行,而在C语言中,0表示假,非0表示真。
2.1.1 悬空else
当运行这个代码:
#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匹配,而不是它对齐的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;
}
使用{}可以让代码的逻辑更加清楚,我们要培养良好的代码风格。
2.1.2 if书写形式的对比
int main()
{
//风格1
int condition = 1;
if (condition)
{
return x;
}
return y;
//风格2
if (condition)
{
return x;
}
else
{
return y;
}
return 0;
}
#include<stdio.h>
int main()
{
int num = 5;
if (10 == num)
{
printf("hehe\n");
}
return 0;
}
比较一个变量和一个常量是否相等的时候,建议把常量放在等号的左边,这样可以避免少一个等号造成的bug,便于发现错误,不过我在熟练使用赋值与判断之后也没有这样用了。
2.1.3 练习
1.判断一个数是否为奇数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
//判断是否为奇数
if (num % 2 == 1)
printf("奇数\n");
else
printf("不是奇数\n");
return 0;
}
2.输出1-100间的奇数
int main()
{
//1. 循环先产生1~100的数字
//2. 判断产生的数字是否为奇数
//3. 是奇数打印
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
i++;
}
return 0;
}
2.2 switch语句
switch语句常用于多分支的情况
如果一周7天判断某天是星期几,写成if...else语句太过冗杂
这时就需要switch语句
其中switch(整形表达式),case 整形常量表达式:
2.2.1 在switch语句中的break
int main()
{
int day = 0;
scanf("%d", &day);
int n = 2;
switch (day)
{
default:
printf("选择错误\n");
break;
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
有时我们的需求变了,输入1-5,输出weekday;输入6-7,输出weekend
int main()
{
int day = 0;
scanf("%d", &day);
int n = 2;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("选择错误\n");
break;
}
return 0;
}
可见break语句实际上是把语句列表划分为不同的分支部分。
在最后一个case语句后面加上一条break语句是一个好习惯。
2.2.2 default子句
如果表达式的值与所有case标签都不匹配,结果就是所有语句被跳过,程序不会终止也不会报错,但是如果并不想不符合case的情况被跳过就需要添加default子句
default:
写在任意一个case标签可以出现的位置。当switch表达式的值不匹配所有case标签时,这个default语句便会被执行,所以每个switch语句只能出现一条default语句,但是它可以出现在语句列表的任意位置。
2.2.3 练习
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1: m++;
case 2: n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1: n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
结果为m = 5,n = 3
3. 循环语句
- while
- for
- do while
3.1 while循环
if语句的特点是,条件满足的情况下,if语句只会执行一次,但是生活中很多时候同一件事需要完成很多次,所以C语言中引入了while语句
while(表达式)
循环语句;
比如在屏幕上打印1-10的数字:
#include <stdio.h>
int main(void)
{
int i = 1;
while(i<=10)
{
printf("%d ",i);
i = i+1;
}
return 0;
}
3.1.1 while语句中的break和continue
break介绍:
int main()
{
int n = 1;
while (n <= 10)
{
if (n == 5)
{
break;
}
printf("%d ", n);
n++;
}
return 0;
}
结果为1 2 3 4
总结:在循环中只要遇到break,就停止后面的所有循环,直接终止,所以while中的break是用于永久终止循环的。
continue介绍:
int main()
{
int n = 0;
while (n <=10)
{
if (n == 5)
{
continue;
}
printf("%d ", n);
n++;
}
return 0;
}
结果为:1 2 3 4
当i=5时,continue执行,跳过后面的代码,跳回while判断部分,判断是否进入循环。
int main()
{
//1 2 3 4 5 6 7 8 9 10
int n = 1;
while (n <= 10)
{
n++;
if (n == 5)
{
continue;
}
printf("%d ", n);
}
return 0;
}
结果为:1 2 3 4 6 7 8 9 10
总结:continue是用于终止本次循环的,也就是本次循环中的continue后面的代码不会执行,而是跳到while语句的判断部分,进行下一次判断。
int main()
{
int ch = 0;
while ((ch=getchar()) != EOF)
EOF:end of file 文件结束标志
{
putchar(ch);
}
return 0;
}
getchar()即获取一个字符,若输入不为EOF(即不为空)就输入一个正常字符
这个代码经过适当的修改是可以用来清理缓冲区的:
int main()
{
char password[20] = { 0 };
int ch = 0;
printf("请输入密码:>");
scanf("%s", password);//123456
//消除\n - 清理缓冲区
while (getchar()!='\n')
{
;
}
printf("请确认密码(Y/N):>");
ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
若没有中间清除缓冲区,则输入密码+回车后直接会打印确认失败,而没有输入Y/N的环节了。
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
这个代码的作用是只打印数字字符,跳过其他字符。