分支和循环语句

发布时间:2024年01月13日

创建个栏目吧,就叫期末90+,就看这个栏目了。可在网上售卖该笔记,售卖题库给大一上学期的。

前言:

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必须是整型表达式
  • default语句的顺序不重要
  • 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
    

文章来源:https://blog.csdn.net/2302_80649596/article/details/135562218
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。