C语言入门之分支语句

本文详细介绍了C语言中的分支结构,包括顺序结构、分支结构(if-else和switch)以及它们的嵌套使用,展示了如何通过if和switch判断奇数、偶数、整数的正负以及除法余数,同时强调了正确使用括号和break的重要性。
摘要由CSDN通过智能技术生成

前言

首先,C语言是结构化的程序设计语言,这里的结构是指顺序结构,选择/分支结构,循环结构,这仔细想想就能发现和我们日常所遇到的事情都可以分为三种或者三种的组合。

顺序结构

顾名思义就是从开始到结束,依次的进行下去。

分支结构

我们可以用 if ,switch来实现。

循环结构

我们可以用 while , for , do while 来实现。

正文

if语句

if语句的表示形式如下

if(表达式)
    语句;

如果条件为真,就执行 if 语句 ,反之则不执行。

C语言的真与假

在C语言中,0表示假,非0表示真,也就是说如果表达式不为零,if语句就执行,如果为零,if语句不执行。

有了这一基础,就可以看下面的例一。

例一 判断奇数

#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m % 2 == 1)//如果是奇数,进入if语句 , 如果不是,跳过if语句
        printf("奇数\n");
    return 0;
}

else 

如果一个数不是奇数,那就是偶数。如果一个数,我们想判断这个数是奇数还是偶数该怎么表达呢?

就是用 if ...... else的语句就可以完成这个任务

if ...... else 的语句形式如下

if(表达式)

        语句1;

else

        语句2;

例二 输入整型,判断奇数还是偶数
#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m % 2 == 1)//m % 2 == 1,进入if语句
        printf("奇数\n");
    else          //m % 2 != 1,进入else语句
        printf("偶数\n")
    return 0;
}

 分支控制多条语句

if 和 else语句在无其他条件下,默认只会控制一条语句,例如:

#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
   if(m < 18)
    printf("未成年\n");
    printf("不建议谈恋爱");
    return 0;
}

运行结果如下

可以看到不管我输入的值是否大于18, printf("不建议谈恋爱"); 都会执行,这是因为if默认只会控制 printf("未成年");这条语句,如果条件为真,执行,如果条件为假,不执行。但是 printf("不建议谈恋爱"); 是一个独立的语句,不管我们的 if 语句是否被执行,它都会执行。

那我们如果要同时控制两条甚至更多的语句该怎么实现呢? 那我们就要使用 {} 将代码括起来,else后也可以使用 {}  如下:

#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m < 18)
    {
        printf("未成年\n");
        printf("不建议谈恋爱\n");
    }
    else
    {
        printf("成年\n");
        printf("自由恋爱\n");
    }
    return 0;
}

运行结果如下:

嵌套if 

在if ...... else 语句中,else还可以与另一个if进行连用,构成多重判断

例三 要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数
#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m == 0 )
    {
        printf("m为%d\n", m);
    }
    else if( m < 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
    {
        printf("m为负数\n");
    }
    else
    {
        printf("m为正数\n");
    }
    return 0;
}

运行结果如下:

再比如 

例四 输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:负数
#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m > 0 )
    {
        if(m % 2 == 0)
            printf("m为偶数\n");
        else
            printf("m为奇数\n");
    }
    
    else
    {
        printf("m为负数\n");
    }
    return 0;
}

运行结果如下

以上就是if的嵌套语法,我们有了if的嵌套,就可以以完成更多复杂逻辑的判断。

悬空else

如果有多个 if 和 else,我们可以记住一条规则,else 总是和最近的 if 相匹配。

我们从下面这个代码开始 

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

运行的结果是什么?

 我们很多初学者,上来以判断 a 是 0,不等于 1 ,那就执⾏ else 语句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。

结果

这是为什么呢?

这就是悬空else的问题了,

上面的代码排版是将 else 和第一个 if 对其了,让我们误以为 else 是和第一个 if 匹配的,当 if 语句不执行,自然而然执行的是 else 语句,打印 haha,实则 else 是第二个 if 匹配的,所以后面的 if ...... else 是嵌套在第一个 if 语句里的,第一个 if 都不执行,那后面的 if ...... else 当然也没有机会执行,最后也就啥都不打印了。

如果将代码改进就更容易理解了

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

 如果想和第一个 if 匹配的话可以这样修改

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

 适当的加入一些大括号{},可以使我们的代码更清晰,可读性更高,所以我们以后在写代码的时候多注意括号使用。

switch语句

switch语句是一种特殊的if......else语句,用于判断多结果的情况,它将多次的else if改成了更简单易懂的形式

switch的语法形式

switch(表达式)
{
    case value1: statement//如果表达式结果为value1,执行该语句
    case value2: statement//如果表达式结果为value2,执行该语句
    default: statement    //如果表达式结果既不是value1也不是value2,执行该语句
}
注意

1. switch后的表达式必须是整型表达式

2. case后的值必须是整型常量表达式

 if语句和switch语句相对比

例五 输入一个整数,计算除3之后的余数
如果使用的是if语句,如下
#include<stdio.h>
//输入一个整数,计算除3之后的余数
int main()
{
	int x = 0;
	scanf("%d", &x);
	if (x % 3 == 0)
		printf("x除3之后的余数是0");
	else if (x % 3 == 1)
		printf("x除3之后的余数是1");
	else
		printf("x除3之后的余数是2");
	return 0;
}
 switch语句
#include<stdio.h>
int main()
{
	int x = 0;
	scanf("%d", &x);
	switch (x % 3)
	{
	case 0:
		printf("x除3之后的余数是0");
	case 1:
		printf("x除3之后的余数是1");
	case 2:
		printf("x除3之后的余数是2");
	}
	return 0;
}

switch运行的结果

这是为什么呢?

因为switch语句中的case语句只是决定了程序的入口,决定不了出口,如果代码没有遇到其他情况的话,会从入口一直运行到switch的结尾。

那么这个其他情况是什么呢?

就是在case语句的末尾加break语句,意思就是代码运行到break语句的时候跳出switch语句(相当与case语句的出口) 

所以改良后的switch语句是这样的
#include<stdio.h>
int main()
{
	int x = 0;
	scanf("%d", &x);
	switch (x % 3)
	{
	case 0:
		printf("x除3之后的余数是0\n");
		break;
	case 1:
		printf("x除3之后的余数是1\n");
		break;
	case 2:
		printf("x除3之后的余数是2\n");
		break;
	}
	return 0;
}

运行结果如下

 根据以上代码,我们需要注意的点如下

1. case语句和后面的整型常量表达需要“空格”

2. case语句执行完后,需要在末尾加break语句,这样才能跳出switch语句

switch中的default语句

我们在switch语句经常会遇到一种情况,就是switch表达式值无法匹配case语句的时候,要么就不处理,要么就加一个default语句

switch(表达式)
{
    case value1: statement//如果表达式结果为value1,执行该语句
    case value2: statement//如果表达式结果为value2,执行该语句
    default: statement    //如果表达式结果既不是value1也不是value2,执行该语句
}

switch语句中case和default的顺序关系

switch语句中的case和default一定有顺序关系吗,default一定在case后面吗?

其实,并没有顺序关系,只是为了代码的可读性和美观通常是放在语句的末尾的。

结尾

以上就是分支语句的全部知识了,在文中有出现“==”,“<”这些运算符我也会在后期发一篇文在专门讲运算符。

如果文中有问题,欢迎大家指出,我会及时改正!

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值