【C语言】3.C语言分支和循环(1)


1.if语句

1.1 if

if语句我们可以用来根据表达式是否为真,来确定语句是否执行。

C语言中非零即为真除了0之外都是真

if(表达式)
    语句;

这里,如果表达式为真,则执行语句。如果表达式为假,则不执行语句。

1.2 分⽀中包含多条语句

if(表达式)
    语句1;
	语句2;

这个例子里面,如果表达式为真,则执行语句1。然后执行语句2。

如果表达式为假,则不执行语句1。然后执行语句2。

这里面和1.1里面有所不同,因为默认在 if 和 else 语句中默认都只控制一条语句

也就是说,1.2里面的例子相当于

if(表达式){
    语句1;
}
	语句2;

😊这么说应该能明白了。

如果要语句1和语句2都执行的话要怎么办呢?

if(表达式){
    语句1;
    语句2;
}

这个时候我们只要用大括号{}把语句1和语句2括起来就可以了。

1.3 if else

如果说,想要根据表达式来进行语句执行的筛选操作,就可以用if else语句。这么说可能有点迷糊,下面我举个例子。

例如:想要根据成绩来确定自己有没有及格?

int main() {
    int  score = 0;//定义成绩是score这个变量
    scanf("%d", &score);//输入成绩
    if (score >= 60) {       
        printf("成绩合格\n");//如果成绩大于等于60分,就输出成绩合格
    }
    else {
        printf("成绩不合格\n");//否则,就输出成绩不合格
    }
}

1.4 嵌套if

那如果成绩有好多个等级,那我们怎么写呢?

这个时候,我们可以用else if语句来构成多重判断。

else if 中间有个空格的,这个要注意!

例如:score>=90优秀,70<=score<90良好 ,60<=score<70合格,score<60不合格。

int main() {
    int  score = 0;//定义成绩是score这个变量
    scanf("%d", &score);//输入成绩
    if (score >= 90) {
        printf("成绩优秀。\n");//如果成绩90<=score,就输出成绩优秀
    }
    else if (70 <= score < 90) {//如果成绩70<=score<90,就输出成绩良好
        printf("成绩良好。\n");
    }
    else  if (60 <= score < 70) {//如果成绩60<=score<70,就输出成绩合格
        printf("成绩合格。\n");
    }
    else {
        printf("成绩不合格。\n");//否则,就输出成绩不合格
    }
}

1.5 else悬空

如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配

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 匹配。我们可以把格式整理一下:

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(b == 2)匹配的。

因为a=0,在执行if(a == 1)的时候,a == 1为假,所以就不会执行后面的if(b == 2)和它对应的else语句了 。

欸,那如果我们想让这个else和第一个if匹配该怎么搞?

int main()
{
    int a = 0;
    int b = 2;
    if(a == 1){
        if(b == 2)
            printf("hehe\n");
    }
    else
        printf("haha\n");
    return 0;
}

直接加个{}就行了~😍


2.关系操作符

“关系运算符”主要有下面6个:

  1. > 大于运算符
  2. <小于运算符
  3. >=大于等于运算符
  4. <= 小于等于运算符
  5. == 相等运算符
  6. != 不相等运算符

关系表达式通常返回 0 或 1 ,表示真假。

例如:

int main() {
	int a, b, c, d, e, f, g, h;
	a = (1 > 2);//假
	b = (1 < 2);//真
	c = (1 <= 2);//真
	d = (1 >= 2);//假
	e = (1 == 2);//假
	f = (1 == 1);//真 
	g = (1 != 2);//真 
	h = (1 != 1);//假
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	printf("c=%d\n", c);
	printf("d=%d\n", d);
	printf("e=%d\n", e);
	printf("f=%d\n", f);
	printf("g=%d\n", g);
	printf("h=%d\n", h);
	return 0;
}

打印:

a=0
b=1
c=1
d=0
e=0
f=1
g=1
h=0

在这里需要注意的是:

===容易写错,一旦写错,可能就会出现逻辑上的bug了,比较麻烦。

这个情况可以避免的,只要我们把数字写在==的左侧。

if(3==a){
    printf("1\n");
}

为什么说这个情况可以避免呢?因为如果漏了个=,就变成了

if(3=a){
    printf("1\n");
}

众所周知,我们不能给常量3赋值呀,这样机器就会报错了,你就知道在哪一行里面有问题了。


另外,另一个需要注意的是:多个关系运算符不宜连用。

int main() {
	int a;
	a = 2 < 3 < 2;
	printf("a = %d", a);
	return 0;
}

例如这个,打印:

a = 1

这里面先执行了2 < 3,得到真,也就是1。

然后(2 < 3) < 2,相当于1 < 2,为真。得到1。

a = (2 < 3) < 2 = (1 < 2) = 1

-> a = 1

如果要用多个关系运算符连用的话,要么自己分清楚优先级,要么就加小括号来限定哪一个先来👍


3.条件操作符

条件操作符也叫三目操作符,形式如下:

exp1 ? exp2 : exp3
  |       |      |
表达式1?表达式2:表达式3

表达式为真,计算表达式2

表达式为假,计算表达式3


举个例子:使用条件表达式实现找两个数中较大值。

int main()
{
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 int m = a>b ? a : b;//如果a>b,那么m=a;如果a<=b,那么m=b。
 printf("%d\n", m);
 
 return 0;
}


4.逻辑操作符:&& , || , !

4.1 逻辑取反运算符 !

a!a
非00
01

举个例子:

int main() {
	int a = 1;
	int b = 0;
	int c, d;
	c = !a;
	d = !b;
	printf("c=%d\n", c);
	printf("d=%d\n", d);
	return 0;
}

打印:

c=0//a = 1,!a=0
d=1//b = 0,!b=1

4.2 逻辑与运算符

aba&&b
非0非01
非000
0非00
000

看着记不住怎么办?

记住:有0则0

只要a和b里面有一个是0,a&&b就是0。

除非a和b都是1,那么a&&b就等于1。


4.3 逻辑或运算符

aba||b
非0非01
非001
0非01
000

同样的,记住:有1则1

只要a和b里面有一个是1,a||b就是1。

除非a和b都是0,那么a||b就等于0。


4.4 短路

C语言逻辑运算符总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。

如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

if(month >= 3 && month <= 5)

如果不满足month >= 3,那么&&就不会执行后面的month <= 5这个判断了。可以结合我上面说的有0则0

这就是所说的C语言的短路。

 if(month == 12 || month==1 || month == 2)

如果month == 12刚好满足,那么||就不会执行后面的month==1month == 2这个判断了。可以结合我上面说的有1则1


5.switch语句

5.1 if语句和switch语句的对⽐

如果有3种蛋糕,A🎂,B🎂,C🎂。一次只能买一块吃掉。

一块A🎂1块钱,一块B🎂2块钱,一块C🎂3块钱。

用if语句写:

int main() {
	int n;
	scanf("%c", &n);
	if (n == 'A') {
		printf("给你A蛋糕");
	}
	else if (n == 'B') {
		printf("给你B蛋糕");
	}
	else if (n == 'C') {
		printf("给你C蛋糕");
	}
	return 0;
}

输入:

2

打印:

给你B蛋糕

用switch语句写:

int main() {
	int n;
	scanf("%d", &n);
	switch (n) {
	case 1:
		printf("给你A蛋糕");
		break;
	case 2:
		printf("给你B蛋糕");
		break;
	case 3:
		printf("给你C蛋糕");
		break;
	}

	return 0;
}

输入:

2

打印:

给你B蛋糕

当我输入2以后。

  1. 把2赋值给n。
  2. switch(n)就相当于switch(2)
  3. 这里switch(2),就会跳转到case 2:那里面去。

注意:

  1. case 和后边的数字之间必须有空格。

  2. 每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。


5.2 switch语句中的break

如果去掉break会咋样?

int main() {
	int n;
	scanf("%d", &n);
	switch (n) {
	case 1:
		printf("给你A蛋糕");
	case 2:
		printf("给你B蛋糕");
	case 3:
		printf("给你C蛋糕");
	}

	return 0;
}

输入:

1

打印:

给你A蛋糕给你B蛋糕给你C蛋糕

输入:

2

打印:

给你B蛋糕给你C蛋糕

输入:

3

打印:

给你C蛋糕

通过上面3个例子,我们可以看出没有break的话,程序会按照顺序往下走动。直到走完或者遇到break为止。


5.3 switch语句中的default

有时候switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要在 switch 语句中加入default 子句。

int main() {
	int n;
	scanf("%d", &n);
	switch (n) {
	case 1:
		printf("给你A蛋糕");
		break;
	case 2:
		printf("给你B蛋糕");
		break;
	case 3:
		printf("给你C蛋糕");
		break;
    default:
    	printf("你输错了");
	}  
	return 0;
}

输入:

4

打印:

你输错了

5.4 switch语句中的case和default的顺序问题

在 switch 语句中 case 语句和 default 语句是没有顺序要求的。

不过我们通常是把 default 子句放在最后处理的。


求三连!
在这里插入图片描述

  • 37
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值