分支循环语句(上)

本文介绍了C语言中的选择结构,如if和switch,以及它们的基本用法、关系表达式、逻辑操作符(&&,||,!)、条件操作符(?:)和switch语句的使用,包括分支、else与if的关系、短路行为和default分支的处理。
摘要由CSDN通过智能技术生成

铺垫一下:C语言是一门结构化的程序设计语言,支持三种结构:顺序结构、选择结构、循环结构。顺序结构就是直接一条路走到黑这个意思,选择结构就是一件事情接下去可能会有其他的选项,循环结构就是一件事情去循环的做。

于是为了实现这种选择结构,C语言就提供了if和switch语句,也提供了for、while和do.while循环来实现循环结构

正文:

  1. if语句基本结构:if(表达式)

                  语句

表达式的结果如果为真,语句就会被执行,为假,就不会被执行(C语言中0表示假,非0为真)。

例子:

if后面表达式中如果输入一个奇数,结果为1非0,就可以执行下面的语句,如果输入偶数,结果为0,就不会执行。

//输入一个数,判断是否为奇数:
int main()
{
	int num = 0;
	//输入
	scanf("%d", &num);
	//判断
	if (num % 2)
		printf("%d是奇数\n", num);
	return 0;
}

注意事项:if后面默认跟一条语句,如果需要跟多条语句,需要把这些语句都用{ }给包括起来。而且,可以使用{ }来实现if语句的嵌套使用。

//输入一个数判断是什么数
int main()
{
	int n = 0;
	scanf("%d", &n);
	//情况1:可能是0
	if (n == 0)
	{
		printf("输入的值是0\n");
	}
	//情况2:非0
	else
	{
		if (n > 0)//正
		{
			printf("输入的值是正数\n");
		}
		else
			printf("输入的值是负数\n");//负
	}
	return 0;
}

如果简化一下,就变成如下:

int main()
{
	int n = 0;
	scanf("%d", &n);
	//情况1:可能是0
	if (n == 0)
	{
		printf("输入的值是0\n");
	}
	//情况2:非0
	else if (n > 0)//正
	{
		printf("输入的值是正数\n");
	}
	else printf("输入的值是负数\n");//负
	return 0;
}

注意事项:判断0的那个表达式,用的是==而不是=。因为判断是==,如果是=,那就是赋值,赋值为0的话,是不会走这条路的。

接下来细说悬空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;
}

可以先猜一下代码结果是什么。 

啥都没有其实……

很多初学者会觉得是先判断a是否为1,不为1,走下面else打印haha,但是下面的else是和上面的if(b==2)匹配的,也就是说它判断a不等于1之后后面没有else了,就结束了。其实这样子对齐只是为了混淆视听,现实中这样的代码是不合格的,我觉得很坏就对了。最好是这样写:

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

	    else
		    printf("haha\n");
    }
	return 0;
}

同时这样也可以说明if和else合起来是一条语句,叫做ifelse语句,希望大家可以清楚。

如果想要打印出一开始想要的那种效果,可以:

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

 2.关系操作符:C语言中,大于等于写作>=,小于等于写作<=,不等于写作!=。判断两个数或者两个对象之间的关系叫做关系表达式。关系表达式通常计算的结果返回的是0和1,表示真假,通常用于if或者while语句当中。再次强调 ==才是判断,=为赋值。

int main()
{
	int x = 0;
	if (x == 3)
	{
		printf("hehe\n");
	}
	return 0;
}

结果是不打印的,但是如果将==变成=:

int main()
{
	int x = 0;
	if (x = 3)
	{
		printf("hehe\n");
	}
	return 0;
}

 因为变成了赋值表达式,x的值是3,非0,就会打印。

接下来关于要连续进行判断比如1<a<3这种形式的。

在C语言中,这种写法在语法层面是不会报错的,但是其逻辑是有问题的。例如:

int main()
{
	int a = 3;
	int b = 20;
	int c = 5;
	if (a < b < c)
		printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

结果是:

表达式执行的其实是先去判断a<b,结果为真,返回1,所以a<b的值就是1,然后1再去和c比较,结果也为真,所以打印hehe。如果想要达到预期效果,正确的写法应该是a<b&&b<c。

3.条件操作符:也称三目操作符

基本形式:表达式1?表达式2:表达式3(由问号和冒号隔开的操作符)

计算逻辑:如果表达式1为真,就计算表达式2,如果表达式1为假,就计算表达式3,最后的结果是整个表达式的结果。

例:

int main()
{
	int a = 0, b = 0;
	scanf("%d", &a);
	b = (a > 4 ? 3 : 6);
	printf("%d", b);
	return 0;
}

 

另外,关于三目操作符的组合,是从右到左计算的

例:

4.逻辑操作符:&&,||,!,分别表示并且、或者和逻辑取反(改变单个表达式的真假),主要用于构建更复杂的表达式

逻辑取反:

int main()
{
	int flag = 0;
	if (!flag)
		printf("hehe\n");
	return 0;
}

 

逻辑与运算符:

 两个为真才是真的真,两个只要其中之一为假就是假。

逻辑或运算符:

两个为假才是真的假,两个只要其中之一为真就是真。

例子:判断是否为闰年

//1.能被400整除
//2.能被4整除但是不能被100整除
int main()
{
	int year = 0;
	//输入;
	scanf("%d", &year);
	//判断:
	if (year % 4 == 0)
	{
		if (year % 100 != 0)
		{
			printf("闰年\n");
		}
	}
    if (year % 400 == 0)
	{
		printf("闰年\n");
	}

	return 0;
}

 

int main()
{
	int year = 0;
	scanf("%d", &year);
	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		printf("闰年\n");
	return 0;
}

短路:C语言中逻辑运算符还有一个特点,它总是先对左侧的表达式求值,然后再对右边的表达式求值,这个顺序是保证的,如果左边的表达式满足逻辑运算符的条件时,就不再对右边进行求值,这种情况称为短路。

先拿&&来说,if (a>=3&&a<=5) ,当数入4时,左边为真,它还要去判断右边。如果输入1时,左边为假,那么右边为假或者真都不重要了,就不会计算右边,提前终止。

对于||,if (a>=3||a<=5) ,如果输入4时,已经满足条件了,就不会再去计算右边。

例:

int main()
{
	int i = 0, a = 1, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;//赋值表达式,优先级较低,所以先算右边再赋值给i
	//i = a++ || ++b || d++;
	printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
	printf("i=%d\n", i);
	return 0;
}

a=0,a++先赋值后++,等号右边第一个的结果为0,于是后面的b也不会计算了,所以a&&b整体为0,于是后面的d也不会计算了,所以整体为0,i=0。

同理,如果将a改为1,整体变为真,i=1。

int main()
{
	int i = 0, a = 1, b = 2, c = 3, d = 4;
	//i = a++ && ++b && d++;//赋值表达式,优先级较低,所以先算右边再赋值给i
	i = a++ || ++b || d++;
	printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
	printf("i=%d\n", i);
	return 0;
}

先算a++,先赋值为0,然后++,于是b也要计算,++b结果为2,所以a++||++b整体为1,于是后面就不用计算了,d不变,整体为真,i=1。 

 

5.switch语句:

括号内部为表达式,根据表达式的情况执行相应的case分支,如果找不到对应的值,就执行default分支。另外括号的表达式为整型表达式,并且case后面衔接着的是整型常量表达式。

int main()
{
	int n = 0;//打印数字被3整除得到余数的结果
	scanf("%d", &n);
	switch(n % 3)
	{
	case 0:
		printf("整除了,余数是0\n");
	case 1:
		printf("余数是1\n");
	case 2:
		printf("余数是2\n");
	case 3:
		printf("余数是3\n");
	}
	return 0;
}

这个代码并不完美,运行结果有误。

 原因是case是一个入口,但是后面得衔接停下来的指令,如果没有的话它会一直走下去,知道switch语句结束。如果想停下来,就加入break。 

int main()
{
	int n = 0;//打印数字被3整除得到余数的结果
	scanf("%d", &n);
	switch(n % 3)
	{
	case 0:
		printf("整除了,余数是0\n");
        break;
	case 1:
		printf("余数是1\n");
        break;
	case 2:
		printf("余数是2\n");
        break;
	case 3:
		printf("余数是3\n");
        break;
	}
	return 0;
}

 关于default,如果所有的case都不匹配就会匹配上default 

 严格来说default语句没有位置要求,但是写代码时都是先写出可能的情况最后再写default。

以上就是关于分支语句的内容,over。

 

 

 

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值