C语言王国——选择与循环(1)

目录

一、引言

二、选择结构

1,if语句

1.1,if...else...语句

1.2,多分支语句

1.3悬空else的问题

2,switch语句

2.1,switch

2.2,break

2.3,default


一、引言

写了几个C语言代码我发现C语言程序和我们做事一样,按照顺序做事,选择做某事或者重复做某事。那我们继续对C语言深入认知:

C语言是结构化的程序设计语言,这⾥的结构指的是顺序结构、选择结构、循环结构,C语言是能够实 现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种 结构的组合。

顺序结构:就如我们人做事一样一样的进行。

选择结构:就是对多个分支选择一个进行。用if、swich语句来实现。

循环语句:对同一件事反复进行。用for、while、do while语句来实现。

那接下来就让我们了解这些结构:

二、选择结构

*顺序结构大家已经耳熟能详了,C语言中也没有对顺序结构有特殊的语句所以不再做详细叙述。

1,if语句

1.1,if...else...语句

if语句的语法表达式如下:

cpp 复制代码
if (//表达式)
{
    //语句1
}
else
    //语句2

*若语句只为一句,大括号可以不加。

这个代码执行的逻辑就是,表达式成立则执行语句1,反之则执行语句2。

那C语言怎么判断表达式成立的呢?

在C语言中有一个特别的数0,0则代表假,非0则代表真。

举一个例子方便大家理解:

输出a和b中大的数字

cpp 复制代码
if (a>b)
{
    printf("%d",a);
}
else
    printf("%d",b);

正如代码上显示的表达式为a>b,若成立则而1即为真,则打印a;若不成立则为0,即为假。则打印b,

1.2,多分支语句

有细心的人就会发现只有if和else那只能分成两种情况啊,那如果多种情况我们该如何编写呢?其实大家不用担心,C语言在设计的时候已经考虑到了这个问题,那就是在if..else...语句中,else可以与另外一个if语句连用,构成多重判断。

举个例子:

判断整数的正负性

cpp 复制代码
#include<srdio.h>

int main()
{
    int num = 0;
    scanf("%d",&num);
    if(num > 0)
        printf("你输入的数字为正数");
    else if(num < 0)
        printf("你输入的数字为负数")
    else
        printf("你输入的数字为0");

    return 0;
}

这个例子中就很好的利用到了else if,最后再加上一个else把没有讨论到的0也加上去。

*else if的使用其实就是构成了嵌套的if语句。

*if语句也可以在if语句中使用也属于if语句的嵌套。

1.3悬空else的问题

在写代码中常常会遇到else写着写着位置跑丢了,不知道跟谁匹配了。那接下来姜糖就跟大家聊一聊这个问题。

大家如果遇到有多个if和else,可以记住这样的一条规则,else总是跟最接近的if匹配。那大家就来看看下面这个代码:

cpp 复制代码
#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;
}

大家那想一想输出结果是什么呢?

输出结果为啥也没有输出,嘿嘿嘿,想到了吗?

没想到也没有问题,接下来我们一起来分析一下:

可能有些人会想else跟第一个if对齐的所以a=0不=1所以输出haha。但我上面不是跟大家说过吗,else总是跟最接近的if匹配所以else是和第二个if相匹配,而大家所认为的对齐和排版是不绝对这个的,大家可以试试你把代码放一行也是可以运行的。排版只是方便程序员的理解。

比如我改一下这个代码:

cpp 复制代码
#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;
}

这样子,大家是不是更好理解了。

或许有的人希望让这个else与第一个if匹配那有什么办法了。 豁,还真有办法,数学中你想让什么在一起计算加括号就行了,那我这边也是不是可以加括号呢?是的,只不过加的是大括号。这样我们就可以这样修改这个代码:

cpp 复制代码
#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;
}

只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

2,switch语句

2.1,switch

在C语言中的选择结构中除了if语句外,C语言还提供了switch语句来实现分支结构。

switch 语句是⼀种特殊形式的if...else 结构,用于判断条件有多个结果的情况。它把多重 的 else if 改成更易用、可读性更好的形式。

代码定义如下:

cpp 复制代码
switch(条件语句)
{
    case 条件1: 语句1
    case 条件2: 语句2
    default: 语句3
}

switch语言中是根据条件语句中不同的值,执行相对应的case分支。如果没有对应的值则执行default分支。

注:

*switch中的条件语句必须是整形表达式

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

那让我来用switch来举个例子:

输入一个整数输入➗3之后的余数

cpp 复制代码
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	return 0;
}

以上的代码有两点值得我们注意:

1,case和后面的数字之间必须有空格。

2,每一个case语句中的代码执行完之后,需加上break,才能跳出这个switch语句。

2.2,break

细心的人已经发现了我在每一个case语句中的代码执行完之后,加上了break,那如果不加会怎么样呢?

cpp 复制代码
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
	case 1:
		printf("余数是1\n");
	case 2:
		printf("余数是2\n");
	}
	return 0;
}

我们发现10/3余数为1,结构程序还多打印了一行余数为2。

这是为什么呢?

原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case 2 中的语句。 所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

2.3,default

在选择结构的多分支中我们常常不能把情况选完,但可以把他们全都归为一类,所以就诞生了else,和default。他们的用法是相同的,只不过放在不同的语句中。

接下来我就举一个例子让大家更深刻的了解他们(用default):

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

	switch (day)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("⼯作⽇\n");
			break;
		case 6:
		case 7:
			printf("休息⽇\n");
			break;
		default:
			printf("输⼊错误\n");
			break;
	}

}

在一个星期中只有七天,那输入的超过7呢,那就提醒他输入错误。

那default和case在switch语句中有顺序要求吗?答案是没有的,只不过我们通常喜欢把default放在最后方便理解。

相关推荐
叫我阿呆就好了2 分钟前
C 实现植物大战僵尸(一)
c语言·开发语言
柒月的猫18 分钟前
求和(2022蓝桥杯A组试题C)
c语言·算法·蓝桥杯
Ning_.2 小时前
力扣第116题:填充每个节点的下一个右侧节点指针 - C语言解法
c语言·算法·leetcode
挥剑决浮云 -3 小时前
STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器
c语言·经验分享·stm32·单片机·嵌入式硬件·学习
zfenggo3 小时前
c/c++ 无法跳转定义
c语言·开发语言·c++
图灵猿4 小时前
【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】
c语言·c++·lua
A懿轩A4 小时前
C/C++ 数据结构与算法【树和二叉树】 树和二叉树,二叉树先中后序遍历详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·二叉树·
WPG大大通9 小时前
基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD& Video 之全功能显示器连接端口方案
c语言·开发语言·计算机外设·开发板·电源·大大通
析木不会编程11 小时前
【C语言】动态内存管理:详解malloc和free函数
c语言·开发语言
达帮主11 小时前
7.C语言 宏(Macro) 宏定义,宏函数
linux·c语言·算法