分支循环(1~6)
目录
- if语句
- 关系操作符
- 条件操作符
- 逻辑操作符:&&,||,!
- switch语句
- while循环
- for循环
- do_while循环
- break和continue循环
- 循环的嵌套
- goto语句
C语言式结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。
我们可以使用if
、switch
、实现分支结构,使用for
、while
、do_while
、实现循环结构。
1、if语句
1.1 if
if语句的语法格式:
if( expression )
statement1
**c语言中,0为真,非0为假,**当expression为真,则statement1执行,expression为假,statement1不执行。
**示例:**输入一个整数,判断是否为奇数
# include <stdio.h>
int main()
{
in num = 0;
scanf("%d", &num);
if(num % 2 == 1)
{
printf("%d 是奇数\n", num);
}
return 0
}
1.2 else
else
长和if
连用构成 if...else...
语句,语法如下:
if( expression )
statement1
else
statement2
如果expression为假,则执行else语句内容
**示例1:**输入一个整数,判断是否是奇数,如果是奇数打印奇数,否则打印偶数。
# include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 0)
{
printf("偶数\n");
}
else
{
printf("奇数\n");
}
return 0;
}
**示例二:**输入一个年龄,>=18就输出:成年,否则输出:未成年。
# include<stdio.h>
int main()
{
int age = 0;
scanf("%d", age);
if(age >= 18)
{
printf("成年\n");
}
else
{
printf("未成年\n");
}
return 0;
}
1.3 分支语句中包含多条语句
else
仅和最近的 if
语句关联,在没有加大括号的时候。
示例:
# include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
上述代码,无论年龄是否成年,都会打印“可以谈恋爱了”。
1.4 嵌套if
在 if else
语句中,else
可以和另一个 if
连用,构成多重判断
**示例:**要求输入一个整数,判断输入的整数时0,还是正数或者负数。
# include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输入的数字时0\n");
else if(num > 0)
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
**示例:**输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。
# include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num > 0)
{
if(num % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
printf("非正数\n");
return 0;
}
1.5 悬空else问题
如果有多个 if
else
, 记住一条规则,else
总是和最接近的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;
}
程序运行的结果是啥?
什么也没有执行
为什么?
else悬空问题,如果有多个 if
else
, 记住一条规则,else
总是和最接近的if
匹配。else
和第二个if
进行匹配,但是如果第一个if
不执行的话,第二个if
就执行不了,最终都没有执行。
# include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(n == 2)
printf("haha\n");
else
printf("hehe\n");
}
return 0;
}
2. 关系操作符
c语言用于比较多表达式,称为“关系操作符”,里面使用的运算符就称为”关系运算符“,主要有六个:
>
大于运算符<
小于运算符>=
大于等于运算符<=
小于等于运算符==
相等运算符!=
不相等运算符
关系表达式通常返回0
或者1
,表示真假。
c语言中,0
表示假,所有非0
表示真.关系表达式常用于if
和while
结构
注意: 相等运算符 ==
与赋值运算符 =
是两种不同的运算符,不可以混淆。
if( x = 3)
因此,为了避免上述的错误,我们可以改变我们的书写习惯。
if(3 == x)
另一个要避免的错误是:多个关系运算符不宜连用
i < j < k
应该写成:
i < j && j < k
3.条件操作符
条件操作符也叫做三目操作符,需要接受三个操作数,形式如下:
exp1 ? exp2 : exp3
条件操作符号的计算逻辑是:如果 exp1
为真,计算 exp2
,计算结果是整个表达式的结果;如果 exp1
为假, 计算 exp3
,计算结果是整个表达式的结果。
示例:
# inclue <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = a>5 ? 3 : -3;
printf("%d", b);
return 0;
}
4.逻辑操作符:&&,||,!
逻辑操作符提供逻辑判断功能,用于构架更加复杂的表达式,主要有三个运算符:
&&
:逻辑与运算符,就是并且的意思(两个表达式都为真,才为真,否则为假)||
: 逻辑或与运算符,就是或者的意思(两个表达式有一个为真则为真)!
: 逻辑取反操作符,(改变单个表达的真假)
4.1逻辑取反运算符!
通过flag
来认识逻辑取反:
# include <stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("haha\n")
}
return 0;
}
4.2逻辑与运算符
# include <stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if(month >= 3 && month <= 5)
{
printf("春天\n")
}
return 0
}
4.3 逻辑或运算符
# include <stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if(month == 12 || month == 1 || month == 2)
{
printf("冬季\n");
}
return 0;
}
4.4 闰年的判断
闰年的判断规则:
能被4整除且不能被100整除
能被400整除
# include<stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
{
printf("是闰年\n");
}
return 0;
}
4.5短路
c语言逻辑运算,总是先对左侧的表达式求值,再对右侧的表达式求值,这个顺序是保证的。
如果左侧的表达式满足了逻辑运算条件,就不再对右侧的表达式求值,这种情况称为短路
if(month >= 3 && month <= 5)
if(month == 12 || month == 1 || month == 2)
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不在对右操作数进行计算的运算称为短路求值。
# include <stido.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;
}
5. switch语句
if
和switch
语句都可以用来实现分支结构。
switch(expression)
{
case value1:statement
case value1:statement
deflaut:statement
}
根据expression
不同的值,执行相应case
分支,如果找不到相应的值,就执行deflaut
分支
注意:
switch
后的expression
必须是整形表达式case
后的值,必须是整型常量表达式
5.1 if语句和switch语句的对比
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
改成switch语句
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
注意:
case
和后面的数字必须有空格- 每一个
case
语句中的代码执行完成后,需要加上break
,才能跳出switch语句
5.2 switch语句中的break
如果去去掉case语句中的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");
case 2:
printf("余数是2\n");
}
return 0;
}
结果:
如果没有case则一直向下走
5.3 switch语句中的deflaut
在使⽤ switch
语句的时候,我们经常可能遇到⼀种情况,⽐如 switch
后的表达式中的值⽆法匹配代码中的 case
语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default
⼦句。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
~switch
~ 后边的 expression
的结果不是 value1 ,也不是 value2 的时候,就会执⾏default
⼦句。
示例:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
5.4 switch语句中的case和default的顺序问题
e value1: statement
case value2: statement
default: statement
}
`~switch`~ 后边的 `expression` 的结果不是 value1 ,也不是 value2 的时候,就会执⾏`default` ⼦句。
**示例:**
~~~c
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
5.4 switch语句中的case和default的顺序问题
在 switch 语句中 case
⼦句和 default
⼦句有要求顺序吗? default
只能放在最后吗?其实,在~ switch~ 语句中 case
语句和 default
语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。不过我们通常是把 default
⼦句放在最后处理的。