【C生万物】C语言分支和循环语句

C语言

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1、if语句
    • 1.1 if语句的语法格式:
    • 1.2 if语句的执行流程
    • 1.3 if ...else 语句
    • 1.4 级联式if语句
    • 1.5 “悬空else” 的问题
  • 2、switch语句
  • 3、while循环
    • 3.1 while语句的格式
    • 3.2 while语句的执行流程
    • 3.3 while语句的实践
  • 4、for循环
    • 4.1 for语句的格式
    • 4.2 for语句的执行流程
    • 4.3 for语句的实践
    • 4.4 for语句和while语句的对比
  • 5、do...while循环
    • 5.1 do...while语句的格式
    • 5.2 do...while语句的执行流程
    • 5.3 do...while语句的实践
  • 6、break和continue
  • 7、goto语句

1、if语句

if 语句允许程序通过测试表达式的值从两种选项中选择一种。

1.1 if语句的语法格式:

if(表达式)
	语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0表示假,非0表示真。也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行

1.2 if语句的执行流程

image.png

1.3 if …else 语句

语法格式:

if(表达式)
    语句;
else
    语句;

1.4 级联式if语句

编程时常常需要判断一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式”if语句常常时编写这类系列判定的最好方法。
例如:下面这个级联式if语句用来判定n是小于0、等于0、大于0

if(n<0)
    printf("%d小于0\n",n);
else
    if(n==0)
        printf("%d等于0\n",n);
	else
        printf("%d大于0\n",n);

虽然第二个 if 语句式嵌套在第一个if语句内部的。通常不会对他对进行缩进,而是把每个else都与最初的 if 对齐:

if(n<0)
    printf("%d小于0\n",n);
else if(n==0)
    printf("%d等于0\n",n);
else
    printf("%d大于0\n",n);

级联式 if 语句独特的书写形式:

if(表达式)
    语句
else if(表达式)
    语句
else if(表达式)
    语句
...
else
    语句

1.5 “悬空else” 的问题

当 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;
}

程序运行结果是什么呢?
很多人认为 a = 0,不等于1,程序执行else子句,打印haha,但是你运行程序的时候,输出结果:什么都没有打印。
image.png
这就是悬空else的问题,如果有多个 ifelse 的时候,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;
}

或者如果我们希望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;
}

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

注:if 和 else 语句默认都只控制一条语句,想要控制多条语句需要加上{},构成复合语句。

2、switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
switch 的语法格式:

switch(表达式)
{
    case 常量表达式:
        语句
    case 常量表达式:
        语句   
    ...
    case 常量表达式:
        语句  
    default :语句
}

switch 的组成部分:

  • 控制表达式switch 后面必须跟着圆括号括起来的整形表达式。C语言把字符当成整数来处理,因此在 switch 语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。
  • 分支标号:每个分支的开头都有一个标号,格式如下:

case 常量表达式:

常量表达式很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10 也是常量表达式,但 n + 10 不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)

  • 语句:每个分支标号的后边可以任意数量的语句,并且不需要用花括号把这些语句括起来。每组语句的最后一条通常是break 语句。

C语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。
default 的作用:
switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。

3、while循环

循环是重复执行其他语句(循环体)的一种语句。

3.1 while语句的格式

while(表达式)
    语句

3.2 while语句的执行流程

image.png
首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

3.3 while语句的实践

练习:在屏幕上打印1~10的值
代码:

#include<stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}

	return 0;
}

运行结果:
image.png

4、for循环

4.1 for语句的格式

for(声明或者表达式1;表达式2;表达式3)
    语句

表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整

4.2 for语句的执行流程

image.png
首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行训话语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环

4.3 for语句的实践

练习:在屏幕上打印1~10的值
代码:

#include<stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}

	return 0;
}

运行结果:
image.png

4.4 for语句和while语句的对比

image.png

5、do…while循环

5.1 do…while语句的格式

do
{
    语句
}while(表达式);

whilefor 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
do...while 循环则是先直接进入循环体,执行循环鱼护,然后在执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。

5.2 do…while语句的执行流程

do...while语句执行流程.drawio.png
do...while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,在判断表达式的结果是!=0,则继续循环,执行循环;判断表达式的结果==0,则循环结束。
所以在do...while 语句中循环体是至少执行一次的,这是do...while 循环比较特殊的地方。

5.3 do…while语句的实践

练习:在屏幕上打印1~10的值
代码:

#include<stdio.h>

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i<=10);

	return 0;
}

运行结果:
image.png

6、break和continue

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环。

  • break 的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行。
  • continue 的作用是跳出本次循环 continue 后边的代码

7、goto语句

C语言提供了一种非常特别的语法,就是goto 语句和跳转标号,goto 语句可以实现在同一个函数内跳转到设置好的标号处。
标号只是放置在语句开始处的标识符:

标识符:  语句

goto语句格式

goto 标识符;

例如:

#include<stdio.h>

int main()
{
	printf("hehe\n");
	goto next;
	
	printf("haha\n");

next:
	printf("跳过haha的打印\n");

	return 0;
}

运行结果:
image.png
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以能不用尽量不去使用;但是goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用goto 就非常的方便了。

for(...)
{
    for(...)
    {
        for(...)
        {
            if(1)
            	goto next;
        }
    }
}

next:
     //...

本来for 循环也使用break 跳出,但是break 只能跳出一次循环,这里就要用3个break 才可以跳出循环,所以这种情况使用goto语句就更快捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/376501.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++重新入门-C++变量作用域

目录 1.C变量定义 2.C作用域 3.局部变量 4.全局变量 5.块作用域变量 6.初始化局部变量和全局变量 1.C变量定义 一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称为…

逆向工程:揭开科技神秘面纱的艺术

在当今这个科技飞速发展的时代&#xff0c;我们每天都在与各种电子产品、软件应用打交道。然而&#xff0c;你是否想过&#xff0c;这些看似复杂的高科技产品是如何被创造出来的&#xff1f;今天&#xff0c;我们就来探讨一下逆向工程这一神秘而又令人着迷的领域。 一、什么是…

WireShark使用教程(TCP/IP 部分情况居然变成三次挥手了???)

WireShark自学 WrieShark介绍WrieShark的应用常见协议包的抓取 WrieShark常用手段混杂模式 和 普通模式混杂模式打开方式普通模式 过滤器过滤器类型捕获过滤器显示过滤器语法捕获到的数据的列的含义常见的 Protocols - Values 键盘快捷键常用的过滤命令常用协议分析ARP 协议分析…

阿里云游戏服务器租用价格表,2024最新报价

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

Halcon机器视觉实战----提取水平方向缝隙区域

前言 如何从一块区域内找到水平方向的缝隙区域&#xff08;不是高斯线条&#xff0c;从图像中提取&#xff0c;而是从区域内提取&#xff0c;考虑到了区域所在的方向&#xff09;&#xff1b; dev_close_window () dev_open_window (0, 0, 800, 800, black, WindowHandle) re…

揭秘海外云手机的诸多优势

在电商领域&#xff0c;相信越来越多人听到“海外云手机”一词。尽管我们熟悉智能手机&#xff0c;但“云手机”到底是什么&#xff1f;它是如何在没有实体形态或SIM卡的情况下存在的呢&#xff1f;实际上&#xff0c;海外云手机相当于您放在国外的虚拟手机。本文将深入探讨这一…

详解洛谷P2912 [USACO08OCT] Pasture Walking G(牧场行走)(lca模板题)

题目 思路 一道模板题&#xff0c;没啥好说的&#xff0c;直接见代码 代码 #include <bits/stdc.h> using namespace std; int n,q,a,to[100001][22],b,deep[100001],c,t[1000001]; struct ff {int id,len; }; vector<ff> vec[100001]; void dfs(int x,int fa,i…

STM32搭建开发环境

常用开发工具简介 集成开发环境 MDK&#xff1a;全名RealViewMDK&#xff0c;是Keil公司&#xff08;已被ARM收购的&#xff09;一款集成开发环境&#xff0c;界面美观&#xff0c;简单易用&#xff0c;是STM32最常用的集成开发环境EWARM&#xff1a;IAR公司的一款集成开发环…

Qt 常见容器类用法(二)

目录 QList类 QLinkedList类 QList类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T是一个指针类型或指针大小的基本数据类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>…

【Git版本控制 03】远程操作

目录 一、克隆远程仓库 二、推送远程仓库 三、拉取远程仓库 四、忽略特殊文件 五、命令配置别名 一、克隆远程仓库 Git是分布式版本控制系统&#xff0c;同⼀个Git仓库&#xff0c;可以分布到不同的机器上。怎么分布呢&#xff1f; 找⼀台电脑充当服务器的⻆⾊&#xff…

2024技术趋势:未来是怎样的?Mendix大咖给你解答

智能空间、 混合区块链、 数字加密货币、 云平台、 无人机、 生成型人工智能、 人工智能代理、 扩展现实&#xff08;XR&#xff09;、 边缘计算、 智能自动化、 网络安全、 量子机器学习、 物联网&#xff08;IoT&#xff09;连接、 可持续的IT。 他们都有什么共同点&#xf…

RSA算法加密、签名和验签、解密

一、背景介绍 RSA是一种非对称加密算法&#xff0c;该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥&#xff0c;公钥是公开的&#xff08;可能同时多人持有&#xff09;。 二、RSA算法工具类 package com.hl.rsademo.util;import java.i…

HubSpot x 小红书:MessageBox打破数据壁垒

在当今数字营销的快速发展环境中&#xff0c;企业面临着将多个系统平台整合在一起以实现更有效营销策略的挑战。然而&#xff0c;随着技术的不断进步&#xff0c;诸如MessageBox这样的工具正在成为解决这一挑战的关键。MessageBox作为一种能够对接多个系统平台的工具&#xff0…

第二证券:大涨5%,这一指数爆发!

A股商场今日上午进一步上行&#xff0c;各大指数持续上涨&#xff0c;其间上证指数克复2800点。小市值股票体现更佳&#xff0c;中证1000指数上午大涨5%。 港股商场方面&#xff0c;今日上午一度大幅上涨&#xff0c;后涨幅有所回落。港股百胜我国今日上午体现抢眼&#xff0c…

动态扩缩容下的全局流水号设计

关于全局流水号&#xff0c;业内用的比较多的就是雪花算法&#xff0c;一直没理解在动态扩缩容下其中的workId和 datacenterId如何设置&#xff0c;查到了几个方法&#xff1a;reidis中取&#xff0c;待后期实践下。 先简单的介绍一下雪花算法&#xff0c;雪花算法生成的Id由…

datax离线同步oracle表到clickhouse实践1

时间&#xff1a;2024.01 目录1、安装启动 oracle19c 容器 2、rpm包安装clickhouse 3、datax安装 4、datax同步 目标库根据要同步的表&#xff0c;按照clickhouse建表规范建表 编写json文件 编写增量同步shell脚本&#xff0c;加入 crond 定时任务 1、安装启动 oracle19c 容器…

SpringBoo+Vue构建简洁日志文件查看系统

点击下载《SpringBooVue构建日志文件查看系统&#xff08;源代码&#xff09;》 1. 前言 想必经常做java开发的小伙伴&#xff0c;其大多数服务都是运行在linux系统上的&#xff0c;当遇到一些比较棘手的bug需要处理时&#xff0c;经常要上服务器去捞日志&#xff0c;然后通过…

Python循环语句——for循环的基础语法

一、引言 在Python编程的世界中&#xff0c;for循环无疑是一个强大的工具。它为我们提供了一种简洁、高效的方式来重复执行某段代码&#xff0c;从而实现各种复杂的功能。无论你是初学者还是资深开发者&#xff0c;掌握for循环的用法都是必不可少的。在本文中&#xff0c;我们…

Spring Web Body 转化常见错误

在 Spring 中&#xff0c;对于 Body 的处理很多是借助第三方编解码器来完成的。例如常见的 JSON 解析&#xff0c;Spring 都是借助于 Jackson、Gson 等常见工具来完成。所以在 Body 处理中&#xff0c;我们遇到的很多错误都是第三方工具使用中的一些问题。 真正对于 Spring 而…

2641. 二叉树的堂兄弟节点 II - 力扣(LeetCode)

题目描述 给你一棵二叉树的根 root &#xff0c;请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。 如果两个节点在树中有相同的深度且它们的父节点不同&#xff0c;那么它们互为 堂兄弟 。 请你返回修改值之后&#xff0c;树的根 root 。 注意&#xff0c;一个节…
最新文章