【C】分支与循环1----if与switch

分支与循环

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 , 表示真假

关系表达式常用于 ifwhile结构

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 子句放在最后处理

最后:

找到真正热爱的事,并为之付出时间和耐心,享受这一过程中的高光时刻,也不惧路上的艰难坎坷

这是对漫长岁月最好的回馈

保持热爱,奔赴山海,追光的你终会光芒万丈...

相关推荐
数据小小爬虫26 分钟前
Python爬虫获取AliExpress商品详情
开发语言·爬虫·python
小爬虫程序猿27 分钟前
利用Python爬虫速卖通按关键字搜索AliExpress商品
开发语言·爬虫·python
一朵好运莲34 分钟前
React引入Echart水球图
开发语言·javascript·ecmascript
最后一个bug37 分钟前
rt-linux中使用mlockall与free的差异
linux·c语言·arm开发·单片机·嵌入式硬件·算法
EleganceJiaBao40 分钟前
【C语言】结构体模块化编程
c语言·c++·模块化·static·结构体·struct·耦合
Eiceblue1 小时前
使用Python获取PDF文本和图片的精确位置
开发语言·python·pdf
xianwu5431 小时前
反向代理模块。开发
linux·开发语言·网络·c++·git
xiaocaibao7771 小时前
Java语言的网络编程
开发语言·后端·golang
brhhh_sehe1 小时前
重生之我在异世界学编程之C语言:深入文件操作篇(下)
android·c语言·网络
Bucai_不才1 小时前
【C++】初识C++之C语言加入光荣的进化(上)
c语言·c++·面向对象