文章目录
1. 什么是语句?
C语句可分为以下五类:
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语
言有九种控制语句,可分成以下三类:
2. 分支语句(选择结构)
选择结构的程序设计是一种根据判断条件的成立与否来确定下一步所做操作的一种程序控制结构。其程序的执行流程不再像顺序结构那样,从上到下一条条依次执行所有语句,而是根据判断条件的成立与否而走向不同的分支,因而,选择结构也被称为分支结构。C语言对某一条件成立与否的判断处理是用关系运算和逻辑运算来解决的。
2.1 if语句
if语句的用法:
if(condition)
{
/* 如果condition为真将执行的语句 */
}
代码1:
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
return 0;
}
if…else 语句的用法:
if(condition)
{
/* 如果condition为真将执行的语句 */
}
else
{
/* 如果condition为假将执行的语句 */
}
代码2:
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
多分支:
if(condition_1)
{
/* 如果condition_1为真将执行的语句 */
}
else if(condition_2)
{
/* 如果condition_2为真将执行的语句 */
}
else
{
/* 如果condition_1和condition_2为假将执行的语句 */
}
代码3:
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if (age >= 30 && age < 50)
{
printf("中年\n");
}
else if (age >= 50 && age < 80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
}
注意:
2.1.1 悬空else
注意这个代码:
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
输出结果为空,并非haha。
改正:
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书写形式的对比
代码1:
if (condition)
{
return x;
}
return y;
代码1的意思是:condition为真则返回x,否则返回y。但是,在阅读上并不直观,可改为:
代码2:
if (condition)
{
return x;
}
else
{
return y;
}
代码3:
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
代码2并没有错,但是在写num == 5时很容易漏写一个等号,写成num = 5:
此时程序依然可以执行,不会报错,因为num被赋值为5,判断条件为真,可以执行,但实际上已经错了,所以代码2可以写成:
代码4:
int num = 1;
if (5 == num)
{
printf("hehe\n");
}
因为当漏写等号时,即5 = num,程序会报错:
总结:
2.1.3 练习
- 判断一个数是否为奇数
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 1)
{
printf("%d是奇数\n", n);
}
else
{
printf("%d不是奇数\n", n);
}
return 0;
}
- 输出1-100之间的奇数
int main()
{
for (int i = 0; i < 100; i++)
{
if (i % 2 == 1)
{
printf("%d是奇数\n", i);
}
}
return 0;
}
2.2 switch语句
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
C 语言中 switch 语句的语法:
switch(expression){
case constant-expression :
statement(s);
break; /* 可选的 */
case constant-expression :
statement(s);
break; /* 可选的 */
/* 您可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
}
switch 语句必须遵循下面的规则:
- switch 语句中的 expression 是一个**整型表达式**。
- 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
- case 的 constant-expression 必须为**整形常量表达式**。
- 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
- 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
- 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会继续执行后续的 case,直到遇到 break 为止。
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
2.2.1 在switch语句中的 break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
比如:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
有时候我们的需求变了:
所以我们的代码就应该这样实现了:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
break语句的实际效果是把语句列表划分为不同的分支部分。
编程好习惯:
2.2.2 default子句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签default:
写在任何一个 case
标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
编程好习惯:
2.2.3 练习
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++; //m=3
case 2:
n++; //n=2
case 3:
switch (n)
{//switch允许嵌套使用
case 1: //跳过
n++;
case 2:
m++; //m=4
n++; //n=3
break;
}
case 4:
m++; //m=5
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n); //m = 5, n = 3
return 0;
}
3. 循环语句
有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。
编程语言提供了更为复杂执行路径的多种控制结构。
循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:
C 语言提供了以下几种循环类型:
- while
- for
- do while
3.1 while循环
只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。
C 语言中 while 循环的语法:
while(condition)
{
statement(s);
}
例如:
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
3.1.1 while语句中的break和continue
break
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
总结:
break在while循环中的作用:
continue
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
continue;
printf("%d ", i);
i++;
}
return 0;
}
这里当i=5时,会跳出循环到条件判断中,但i仍然是5,所以形成了死循环。
改正:
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
总结:
continue在while循环中的作用就是:
再看几个代码:
int main()
{
int ch = 0;
//getchar读取输入缓冲区里的数据。
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
练习1:
int main()
{
char passwd[10] = { 0 };
printf("请输入密码:>");
scanf("%s", &passwd);
getchar(); //读取回车\n
printf("请确认密码(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
练习2:
//这个代码的作用是:只打印数字字符,跳过其他字符的
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
printf("\n");
}
return 0;
}