分支和循环语句上

前言:

C语言是结构化的程序设计语言。这里的结构是指:顺序结构、选择结构、循环结构。 

我们可以使用if、switch实现分支结构;使用for、while、do while实现循环结构。

if语句

语法形式

if(表达式)
   语句

表达式为真,则语句执行;表达式为假,则语句不执行。在C语言中,零为假,非零表示真。

else语句

当表达式为假时,就执行语句2

语法形式

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

嵌套if else语句

直接上例子

//输入一个人的年龄,然后分区间打印不同的结果。
//按照最初始的理论我们应该会写出如下代码
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("少年\n");
	}
	else
	{
		if (age <= 44)    
		{
			printf("青年");
		}
		else
		{
			if (age < 90)
			{
				printf("老年");
			}
			else
				printf("老寿星");
		}

	}
	return 0;

我们会发现如果这样写,我们的程序就很乱,不够简洁。

所以我们改写为:

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18) 
		printf("少年\n");
	else if (age <= 44)   //注意这里我们不用age>=18 && age<=44岁来表示,在这里默认为age>=18
		printf("青年");
	else if (age < 90)
		printf("老年");
	else
		printf("老寿星");
	return 0;
}

悬空else问题

else总是跟最接近的且未匹配的if语句匹配

直接看例题:

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

宝子们思考觉得它会输出什么结果?其实什么都不输出。

这里的缩进有错误,但如果把这段代码拷贝到vs上,vs会自动改变缩进,所以说缩进格式很重要

其实是这样的:

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

如果确实是想要else和第一个if匹配的话,可以合理的利用大括号

关系操作符

  • 关系表达式中的运算符就称为关系运算符
  • 关系表达式的返回值通常为0或1,表示真假
  • 相等运算符==  与  赋值运算符=是两个不同的运算符,不要混淆了
  • 为了防止这种错误,可以写成
    if(3==a)
    这样的话,即使写错了也会报错:“表达式必须是可修改的左值”
  • 多个关系运算符不宜连用
  • i<j<k
    这个表达式表达的意思为: I小于J返回0或1,所以最终是0或1与变量K进行比较
    即
    (i<j)<k

条件操作符

条件操作符也叫做三目操作符,因为有三个操作数,形式如下

exp1 ? exp2 : exp3

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

看段代码吧

//输出两数之间的最大者
#include<stdio.h>
int main()
{
	int a = 0, b = 0;
	scanf("%d%d", &a,& b);
	int m = a > b ? a : b;
	printf("%d", m);
	return 0;
}

逻辑操作符或与非

  •  | |  或运算符:有真则真
  • && 与运算符:有假则假
  • !  取反运算符:改变单个表达式的真假

看个例题就明白啦

//闰年的判断。闰年:能被4整除并且不能被100整除或者能被400整除

int main() {
    int year;

    printf("请输入年份:");
    scanf("%d", &year);

    if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) 
    {
        printf("%d是闰年。\n", year);
    }
    else
    {
        printf("%d不是闰年。\n", year);
    }

    return 0;
}

短路情况

  • 这个考点经常考
  • C语言逻辑运算符有一个特点,他总是先对左侧的表达式求值,再对右侧的表达式求值这个顺序是一定的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况就称为“短路”。
  • if(month >= 3 && month <= 5)
    &&运算符是有假则假的
    如果&&的左操作数的结果为0时,右边操作数就不再执行
    
    if(month ==11 || month==1 || month ==3)
    ||运算符是有真则真的
    如果第一个表达式month==11为1时,那么右边的操作数都不再执行
    
    这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值
    
  • 请思考下面的题目
#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\n c=%d\n d=%d\n", a, b, c, d);
	return 0;
}

//请问输出的是什么

switch语句

  • 除了if语句之外,C语言还提供了switch语句来实现分支结构
  • switch语句是一种特殊的if else语句,用与判断题条件有多个结果的情况。
  • 基本形式
    switch (expression)
    {
    case value1:statement
    case value2:statement
    default:statement
    }
    
  • 注意这个expression必须是整型表达式
  • 注意:字符也是整型表达式,存字符存的是他的ASCII值所以也算
  • default语句的顺序不重要,后面也要加break语句
  • case后必须是整型常量表达式,且必须要有个空格
  • 注意别漏了break语句
  • #include<stdio.h>
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	switch (n % 3)
    	{
    	case 0:
    		printf("整数,余数为0.");
    		break;
    	case 1:
    		printf("余数为1");
    		break;
    	case 2:
    		printf("余数为2");
    		break;
    	}
    	return 0;
    }
  • 如果没有break;语句会怎样呢?
  • #include<stdio.h>
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	switch (n % 3)
    	{
    	case 0:
    		printf("整数,余数为0\n");
    		
    	case 1:
    		printf("余数为1\n");
    		break;
    	case 2:
    		printf("余数为2\n");
    		break;
    	}
    	return 0;
    }
    
    //输出
    6
    整数,余数为0
    余数为1
    

while循环

  • //语法形式
    while(表达式)
         语句

for循环

  • //语法形式
    for(表达式1;表达式2;表达式3)
    表达式1:用于循环变量的初始化
    表达式2:用于循环结束条件的判断
    表达式3:用于循环变量的调整

do while循环

  • //语法形式
    do
        语句;
    while(表达式);           //注意这个;不能省掉
  • while和for循环这两种循环都是先判断再进行循环
  • 而do while循环则是先进入循环体执行循环语句再判断表达式
  • 所以do while语句至少执行循环一次

break和continue语句

  • 在循环执行的过程中如果某些状况发生的时候,需要提前终止循环,这是非常常见的情况。 C语言中提供了break和continue两个关键字,就是应该到循环中的。
  • break的作用是终止整个循环
  • continue的作用是结束本次循环,继续下一次循环,在for循环和while循环中是有所差异的
  • 我们要搞清楚while循环中的break语句、 for循环中的break语句、 while循环中的continue语句、for循环中的continue语句。下面的代码很好地解释了其中的不同点
  • //break举例
    
    1、while循环的break语句
    #include<stdio.h>
    int main()
    {
    	int i = 1;
    	while (i <= 10)
    	{
    		if (i == 5)
    			break;                     //整个循环终止
    		printf("%d", i);
    		i = i + 1;
    	}
    	return 0;
    }
    //输出结果:1 2 3 4 
    
    
    2、for循环中的break语句
    #include<stdio.h>
    int main()
    {
    	for (int i = 0; i < 10; i++)
    	{
    		if (i == 5)
    			break;       //跳出整个for循环
    		printf("%d", i);
    	}
    	return 0;
    }
    //输出结果01234
    
    
  • //continue举例
    
    1、for循环中的continue
    #include<stdio.h>
    int main()
    {
    	for (int i = 0; i < 10; i++)
    	{
    		if (i == 5)
    			continue;       //结束本次循环,继续之后的循环
    		printf("%d", i);
    	}
    	return 0;
    }
    //输出结果012346789  就是没有5
    
    2、while循环中的continue
    #include<stdio.h>
    int main()
    {
    	int i = 1;
    	while (i <= 10)
    	{
    		if (i == 5)
    			continue;   
    当i=5时,就执行continue,直接跳过continue后面的代码,去循环判断的地方
    所以i一直为5,程序陷入死循环 所以输出结果依旧是1234 
    		printf("%d", i);
    		i = i + 1;
    	}
    	return 0;
    }
    //输出结果还是:1 2 3 4 
    

goto语句

  • goto语句可以实现在同一个函数内跳转到设置好的标号处
  • 在多层循环的代码中,如果想要快速跳出循环使用go to就非常方便
  • for (......)
    {
    	for (........)
    	{
    		for (........)
    		{
    			for (........)
    			{
    				for (........)
    				{
    					goto error;
    				}
    			}
    			}
    		}
    		}
    	}
    	}
    }
    
    error:
    

  • 例子
    #include<stdio.h>
    int main()
    {
    	printf("hehe\n");
    	goto next;
    	printf("你猜我这条会不会打印出来?\n");
    
    next:
    	{
    		printf("你看上面的hehe\n");
    	}
    	return 0;
    }
    
    打印结果:
    hehe
    你看上面的hehe
  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值