分支与循环
C语言是一门结构化的程序设计语言
- 顺序结构
- 选择结构
- 循环结构
if语句
if
if 语句的语法形式如下:.
c
if(表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0表示真
例子:输入一个整数,判断是都否为奇数
c
#include <stdio.h>
int main()
{
int num =0;
scanf("%d",&num);
if(num %2==1)
printf("%d 是奇数\n",num);
return 0;
}
过程如下:
else
c
if(表达式)
语句1
else
语句2
例:输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数.
c
#include <stdio.h>
int main()
{
int num =0;
scanf("%d",&num);
if(num %2==1)
printf("%d 是奇数\n",num);
else
printf("%d 是偶数\n",num);
return 0;
}
分支中包含多条语句
默认在if 和 else 语句中默认都只控制一条语句,比如:
c
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
上面的代码,你会发现输入的值不管是>=18还是<18,"可以谈恋爱了"都会打印在屏幕上.
这是因为,此时,if只能控制一条语句
如果需要控制多条语句 ,要使用大括号
大括号里面叫作程序块,或代码块 ,或复合语句
c
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age >= 18){
printf("成年了\n");
printf("可以谈恋爱了\n");
}
return 0;
}
嵌套if
在if else 语句中,else 可以与另一个if 语句连用,构成多重判断
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。请看如下代码:
c
#include <stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num ==0)
printf("输入的数字是e\n");
else
{
if(num > 0)//这里的f相当于嵌套在else语句中,形成了嵌结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
}
return ;
}
可以写成:
c
#include <stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num ==0)
printf("输入的数字是0\n");
else if(num > 0)//这里的f相当于嵌套在else语句中,形成了嵌结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
}
return ;
}
练习:
输入一个人的年龄 如果年龄<18岁,打印"少年"
如果年龄在18岁至44岁打印"青年'
如果年龄在45岁以上打印h
c
#include <stdio.h>
int main()
{
int age =0;
scanf("%d",&age);
if (age < 18)
printf("少年\n");
else if (age >= 18 && age <= 44)
printf("青年\n");
else printf("h");
return 0;
}
不可以写成 18<=age<=44
这是个恒成立 的式子
先判断age时候大于等于18,返回1/0(成立/不成立),而无论是1还是0都比44小
悬空else问题
c
#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;
}
将上面的代码放入VS中,会发现代码自动变为下面这种格式:
c
#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对其无关
所以在编写代码时,要适当使用大括号
关系操作符
C语言用于比较的表达式,称为"关系表达式"(relational expression),里面使用的运算符就称为"关系运算符"(relational operator),主要有下面6个。.大于运算符小于运算符
- 大于等于运算符 >=
- 小于等于运算符 <=
- 相等运算符 == (=赋值)
- 不相等运算符 !=
关系表达式通常返回0或1 , 表示真假
关系表达式常用于 if 或 while结构
c
if(x==3)
{
printf("x is 3.(n");
}
注意:相等运算符 ==与赋值运算符=是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
c
if (x=3)...
这个式子表示对变量x赋值3,它的返回值为3 ,所以if 判断总是为真
建议 :当一个变量和一个常量值比较相等的时候,可以将变量写在等号的右边
c
if (3==x)...
这样的话,如果将==误写成=, 编译器就会报错
另一个需要避免的错误是:多个关系运算符不宜连用
c
i<j<k
上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
c
(i <j) <k
上面式子中,i<j返回0或1,再与k比较
正确写法如下:
c
i<j&&j<k
条件操作符
条件操作符也叫三目操作符,需要三个操作数
c
ecp1 ? exp2 : exp3//表达式1 ? 表达式2 :表达式3
条件操作符的计算逻辑是:
如果exp1 为真,exp2计算,计算的结果是整个表达式的结果;
如果exp1为假, exp3计算,计算的结果是整个表达式的结果
练习1:使用条件操作符表示下面代码的逻辑
c
#include (stdio.h)
int main()
{
int a=0;
int b=0;
scanf("%d",&a);
if (a>5)
b=3;
else
b=-3;
printf("%d\n",b);
return 0;
}
改造后:
c
` #include (stdio.h)
int main()
{
int a=0;
int b=0;
scanf("%d",&a);
b=(a>5?3:-3);
printf("%d\n",b);
return 0;
}
练习2.找出两个数较大值
c
` #include (stdio.h)
int main()
{
int a=0;
int b=0;
int m=0;
scanf("%d",&a);
if (a>b)
m=a;
else
m=b;
printf("%d\n",m);
return 0;
}
逻辑操作符: &&,ll,!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
- ! 逻辑取反运算符(改变单个表达式的真假)。
- && 逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假).
- || 逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
- 注 :C语言中,非0表示真,0表示假
逻辑取反运算符 !
用法如下:
c
#include <stdio.h>
int main(){
int flag = 0;
scanf("%d", &flag);
//flag为真,做一些事
if (flag)
printf("do something\n");
//flag为假,做一些事
if (!flag)
printf("do sometning\n");
return 0;
{
&& 逻辑与运算符
&& 就是与运算符,也是并且的意思,&&是一个双目操作符,使用的方式是a&&b
&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假
|| 逻辑或运算符
||就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方式是a ll b
||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假
短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值 。这种情况称为短路
对于&&操作符:
c
if(month >= 3 && month <=5)
表达式中&& 的左操作数是 month>=3,右操作数是month <=5,当左操作数 month >=3的结果是0的时候,即使不判断 month<=5,整个表达式的结果也是0
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行
对于||操作符:
c
if(month == 12 || month==1 || month ==2)
如果month ==12,则不用再判断month是否等于1或者2,整个表达式的结果也是1
所以,||操作符的左操作数的结果不为0时,就无需执行右操作数
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算 称为短路求值
下面来辨析四种情况:
c
#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\nc = %d\nd = %d\n", a, b,c,d);
printf("i=%d\n",i);
return 0;
}
输出为:1 2 3 4 0
c
#include <stdio.h>
int main()
{
int i = 0,a =1,b=2,c=3,d=4;
i=a++&&++b&&d++;
printf("a = %d\n b =%d\nc = %d\nd = %d\n", a, b,c,d);
printf("i=%d\n",i);
return 0;
}
输出为:2 3 3 5 1
c
#include <stdio.h>
int main()
{
int i = 0,a =1,b=2,c=3,d=4;
i=a++||++b||d++;
printf("a = %d\n b =%d\nc = %d\nd = %d\n", a, b,c,d);
printf("i=%d\n",i);
return 0;
}
输出为: 2 2 3 4 1
c
#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\nc = %d\nd = %d\n", a, b,c,d);
printf("i=%d\n",i);
return 0;
}
输出为: 1 3 3 4 1
switch 语句
switch 语句是一种特殊形式的if...else结构,用于判断条件有多个结果的情况
c
switch (expression)
{
case value1: statement
case value2: statement
.
.
default: statement
}
上面代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行 default分支
注 :
switch 后的 expression必须是整型表达式
case 后的值,必须是整形常量表达式
if语句和switch语句的对比
练习:输入任意一个整数值,计算除3之后的余数
如果使用if语句完成,如下:
c
int main()
{
int n =0i
scanf("%d"&n)i
if (n % 3==0)
printf("余数是0\n");
else if (n % 3==1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
如果使用switch语句完成,如下:
c
int main()
{
int n= 0;
scanf("%d",&n);
switch (n % 3){
case 0:
printf("余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
switch 语句也是分支效果的,只有在switch语句中使用break 才能在跳出switch 语句
如果某一个 case 语句的后边没有break 语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到 break 语句或者 switch 语句结束
break 也不是每个case 语句都得有,得根据实际情况来看
eg:
1.输入1~5,输出的是"工作日";
2.输入6~7,输出"休息日"
c
int main(){
int day =0;
scanf("%d", &day);
switch (day)//char也可以
{
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;
}
switch语句中的case和default的顺序问题
在switch 语句中case 语句和 default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以
不过通常是把 default 子句放在最后处理
最后:
找到真正热爱的事,并为之付出时间和耐心,享受这一过程中的高光时刻,也不惧路上的艰难坎坷
这是对漫长岁月最好的回馈
保持热爱,奔赴山海,追光的你终会光芒万丈...