分支结构:if语句和switch语句

if语句

形如

if(表达式)
  语句

非0为真,执行语句。0为假,不执行语句。

#include<stdio.h>
int main()
{
	int i = 0;//初始化
	scanf("%d", &i);
	if (i % 2)//或i%2==1
		printf("%d是奇数", i);
	return 0;
}

else

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

表达式输出结果为真,执行语句1。输出结果为假,执行语句2.

#include<stdio.h>
int main()
{
	int i = 0;//初始化
	scanf("%d", &i);
	if (i % 2)//或i%2==1
		printf("%d是奇数", i);
	else
		printf("%d是偶数", i);
	return 0;
}

分支中包含多条语句

if和else默认控制一条语句

#include<stdio.h>
int main()
{
	int i = 0;//初始化
	scanf("%d", &i);
	if (i % 2)//或i%2==1
		printf("%d是奇数\n", i);//语句a1
	printf("不能被2整除\n");//语句a2
	else
		printf("%d是偶数", i);//语句b1
	printf("可以被2整除");//语句b2
	return 0;
}

直接在a1后用enter进入下一行,自动缩进如上述,但即使手动将a1a2,b1b2,对齐,结果也一样,都会报错,没有匹配 if 的非法 else 

如果删去语句a2,不会报错,但是由于b2不受else控制,所以无论输入什么都会打印“可以被2整除”

想要if或else控制多条语句需要加上大括号

#include<stdio.h>
int main()
{
	int i = 0;//初始化
	scanf("%d", &i);
	if (i % 2)//或i%2==1
	{
		printf("%d是奇数\n", i);
		printf("不能被2整除\n");
	}
	else
	{
		printf("%d是偶数\n", i);
		printf("可以被2整除\n");
	}
	return 0;

嵌套if

if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断

#include<stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数\n");
	scanf("%d", &num);
	if (num ==0)
		printf("%d是0\n", num);
	else
	{
		if (num > 0)
			printf("%d是正整数\n", num);
		else
			printf("%d是负整数\n", num);
	}
	return 0;
}

可写为

#include<stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数\n");
	scanf("%d", &num);
	if (num == 0)
		printf("%d是0\n", num);
	else if (num > 0)
			printf("%d是正整数\n", num);
	else
			printf("%d是负整数\n", num);

	return 0;
}

悬空else问题

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

#include<stdio.h>
int main()
{
	int a = 1, b = 2;
	if (a == 0)//if1
		if (b == 2)//if2
			printf("haha");
	else
			printf("hehe");
	return 0;
}

上述代码中,if2实际上受if1的控制,else与if2匹配,所以执行后不会打印任何东西

如果希望else和if1匹配,可以用大括号将if2和其语句括起来

为了代码书写与阅读的准确性,应该注意对齐,缩进,适当添加大括号

关系操作符

大于>

小于<

大于等于>=

小于等于<=

相等运算符==(不要和=赋值符号弄混)

int a=3;
if(a=2)

(if括号内的返回值为2,判断为真,继续执行语句)

(为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。

5==a与a==5相同。但5=a会报错)

不相等运算符!=

关系表达式通常返回1或0,表达真假,常用于if while语句

20>12,返回1

12>20,返回0

多个关系操作符不宜连用,如a<b<c

因为关系操作符是从左到右计算,所以真正的意思是(a<b)<c

a=-3,b=-2,c=-1

a<b的返回值为1(判断为真),1<c的返回值为0

整体的返回值为0,判断为假

条件操作符(三目操作符)

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:

如果, exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果exp1 为假 ,exp3 计算,计算的结果是整个表达式的结果

int a = 0, b = 0;
b = (a ? 5, 3: -3);
printf("%d\n", b);
int a = 2, b = 3,m=0;
m = (a > b ? a : b);//将更大的数赋给
printf("%d", m);
return 0;

逻辑操作符

简要介绍

!逻辑取反运算符(改变单个表达式的真假)

&&逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)

||逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)

!(取反面)

a

!a

非0

0

0

1

int a = 0, b = 0;
if (!a)//如果a是0
	printf("a=0\n");

&&(必须同时满足才为真)

a

b

a&&b

非0

非0

1

非0

0

0

0

非0

0

0

0

0

int month = 5;
if (month > 3 && month < 6);
printf("现在是春天");

||(有一个为真就是真)

a

b

a||b

非0

非0

1

非0

0

1

0

非0

1

0

0

0

int month = 1;
if (month > =11 || month < 2)
	printf("现在是冬天");

逻辑操作符的混合使用

#include<stdio.h>
int main()
{
	int year = 0;
	printf("请输入年份\n");
	scanf("%d", &year);
	/*if (year % 4 == 0 && year % 100 != 0)
		printf("是闰年");
	else if (year % 400 == 0)
		printf("是闰年");*/


	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		printf("是闰年");

	return 0;
}

短路

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

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

&&左边为0,直接返回为0,右边就不算了

||左边为非0,直接返回为1,右边就不算了

int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);

输出结果a=1,b=2,c=3,d=4

int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);

输出结果为a=1,b=3,c=3,d=4

switch

switch  语句是⼀种特殊形式的 if...else  结构,⽤于判断条件有多个结果的情况。它把多重的

else if  改成更易用、可读性更好的形式

switch (expression)
{
case value1: statement
case value2: statement
	...
default: statement
}
int num = 0;
scanf("%d", &num);
if (num % 3==0)
    printf("整除");
else if (num % 3 == 2)
	printf("余1");
else
	printf("余2");
int num = 0;
scanf("%d", &num);
switch (num % 3)
{
case 0:
	printf("整除");
  break;
case 1:
	printf("余1");
  break;
case 2:
	printf("余2");
  break;
}

如果找不到对应的值,执行default

switch后面的expression必须是整型表达式(字符也可以,因为字符属于整形家族)

case后面的值必须是整形常量表达式

break代表跳出

如果不添加break,执行后找到对应case,执行相应语句后,会把这个case之后所有case控制的语句都执行一遍

int num = 0;
	scanf("%d", &num);
	switch (num % 3)
	{
	case 0:
		printf("整除\n");
	case 1:
		printf("余1\n");
	case 2:
		printf("余2\n");
	}

输入3,将会出现以下结果

虽然最后一个case直接就能结束,但是建议也加上break,便于后续修改时加上其余case

因为有break的存在,一条case可以控制多条语句,只要在最后一条后面加上break就行

int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
	printf("星期一\n");
	printf("一周最痛苦的一天\n");
	break;
case 2:
	printf("周二\n");
	break;
case 3:
	printf("周三\n");
	break;
}

如果多条case控制语句相同,可以用break简化代码

#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);

    switch (day)
    {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("工作日");
                break;
        case 6:
        case 7:
            printf("休息日");
                break;
    }
    return 0;
}

default

当所有case无法与返回值对应时执行default,default与case无顺序要求,系统通过switch后面表达式的值判断执行哪个语句

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值