C语言学习笔记之结构篇
C语言是一门结构化程序设计语言。在C语言看来,现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象,即顺序,分支(选择),循环。
所谓顺序就是一条路走到黑;生活中在很多事情上我们都需要做出选择,不同的选择会带来不同的结果,这就是分支;有一些事情往往需要在一定条件内重复去做,这就是循环。
C语言为了支持分支和循环的实现,引入了分支语句和循环语句。
目录
分支语句
if 语句
使用细节
switch 语句
使用细节
循环语句
while 语句
使用细节
do...while() 语句
for 语句
使用细节
转向语句
break 语句
continue 语句
return 语句
goto 语句
使用细节
分支语句
C语言中的分支语句有两种,分别是 if 语句和 switch 语句。两种语句分别适用于不同的情景,if语句的使用场景更加普遍。
if 语句
if语句支持单分支,双分支,多分支的实现。单分支语法规则如下:
if (表达式) //表达式结果为真,则执行对应的语句段,否则不执行。
{//语句段
}
//...
双分支语法规则如下:
if (表达式) //表达式结果为真,则执行语句段1,否则执行语句段2。
{//语句段1
}
else
{//语句段2
}
多分支语法规则如下:
if (表达式1) //如果表达式1结果为真,则执行语句段1,后面的分支不再执行,
{ //如果表达式1结果为假,则判断表达式2,为真则执行语句段2,后面的分支不再执行 //语句段1 //如果表达式2结果为假,则判断表达式3,为真则执行语句段3,后面的分支不再执行
} // ...
else if(表达式2) //依此类推,如果所有的表达式结果都为假,则执行else语句的语句段,分支结束。
{//语句段2
}
else if (表达式3)
{//语句段3
}
//...
else
{//语句段4
}
使用细节
1.在C语言中,表达式结果为 0 则为假,非 0 则为真。
#include <stdio.h>int main()
{int num = 0;printf("请输入num的值:> ");scanf("%d", &num);if (num){printf("真\n");}else{printf("假\n");}return 0;
}
2. if 语句默认生效于一条语句,若想让它作用于多条语句,需要加上大括号{}。
#include <stdio.h>int main()
{int num = 0;printf("请输入num的值:> ");scanf("%d", &num);if (num != 0)printf("xixi\n");printf("haha\n");return 0;
}
#include <stdio.h>int main()
{int num = 0;printf("请输入num的值:> ");scanf("%d", &num);if (num != 0){printf("xixi\n");printf("haha\n");}return 0;
}
3.在同一作用域内,else子句会与离它最近的 if语句匹配。
#include <stdio.h>int main()
{int num1 = 0;int num2 = 0;printf("请输入num1和num2的值:> ");scanf("%d %d", &num1, &num2);if (num1 != 0)if (num2 != 0)printf("xixi\n");elseprintf("haha\n");return 0;
}
#include <stdio.h>int main()
{int num1 = 0;int num2 = 0;printf("请输入num1和num2的值:> ");scanf("%d %d", &num1, &num2);if (num1 != 0){ //用 {} 将它们分隔在不同的域if (num2 != 0)printf("xixi\n");}elseprintf("haha\n");return 0;
}
4. if语句可以嵌套使用。
5.多分支 if 语句只会执行最先满足条件的一条分支。多个 if 语句时,每个 if 语句都会判断, 为真则执行。
#include <stdio.h>int main()
{int age = 0;printf("请输入年龄:>");scanf("%d", &age);if (age >= 90){printf("老寿星\n");}else if (age >= 60){printf("老年\n");}else if(age >= 30){printf("中年\n");}else if (age >= 18){printf("青年\n");}else{printf("未成年\n");}return 0;
}
#include <stdio.h>int main()
{int age = 0;printf("请输入年龄:> ");scanf("%d", &age);if (age >= 90){printf("老寿星\n");}if (age >= 60){printf("老年\n");}if(age >= 30){printf("中年\n");}if (age >= 18){printf("青年\n");}else{printf("未成年\n");}return 0;
}
switch 语句
switch 语句语法规则如下:
switch (整型表达式) //当switch语句表达式的结果等于某个case子句的整型常量表达式时,便从此case子
{ //句开始执行
case 整形常量表达式:语句; //在switch语句中没有办法直接实现分支,只能实现从哪个入口进,需要借助break; //break来实现多分支,break作用是结束此分支语句
case 整形常量表达式:语句;break;
case 整形常量表达式:语句;break;
//...
default: //default子句若不需要可以省略不写语句;
}
语法特性:
1.当switch语句表达式的结果等于某个case子句的整型常量表达式时,便从此case子句开始 执行。
2.每个case子句都是一个入口,case子句后必须跟一个整型常量表达式。
3.在switch语句中没有办法直接实现分支,只能实现从哪个入口进,需要借助break来实现多分支,break的作用是结束此分支语句。
4.当所有的case子句都不满足进入条件时,就会执行default子句。
5.default子句如果不需要可以省略不写。
6.每个switch语句中只能出现一条default子句,但是它可以出现在语句列表的任何位置。
示例如下:
#include <stdio.h>
int main()
{int day = 0;printf("今天是星期几:> ");scanf("%d", &day);switch (day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期日\n");break;default:printf("输入不合法\n");break;}return 0;
}
使用细节
1.在符合需求逻辑时可以利用switch语句中无法直接实现分支的特性来编程。
#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}
2.switch语句可以嵌套使用。
#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");int num = 0;scanf("%d", &num);switch (num){case 1:printf("打篮球\n");break;case 2:printf("打乒乓球\n");break;default:printf("复习\n");break;}break;}return 0;
}
循环语句
C语言的循环语句有三种。分别是 while 循环语句,do....while() 循环语句,for 循环语句,其中while语句和for语句的使用场景更加普遍。
while 语句
while语句语法规则如下:
while (表达式) //表达式为真则执行循环语句段,直到表达式为假,终止循环。
{//循环语句段
}
示例如下:
#include <stdio.h>
int main()
{int num = 0;while (num < 10){printf("%d ", num);++num;}printf("\n");return 0;
}
使用细节
1. while循环语句只要表达式结果为真,就会执行循环语句段,因此在while语句内一定要有调整循环变量的语句,使得表达式结果不会永远为真,以防止程序陷入死循环。
#include <stdio.h>
int main()
{int num = 0;//死循环while (num < 10){printf("%d ", num);//++num;}printf("\n");return 0;
}
do...while() 语句
do...while() 语句与 while 语句很类似,区别就是do...while() 语句不管表达式结果是否为真都会先执行一遍循环语句段,即循环至少执行一次。语法规则如下:
do
{//循环语句段;} while (表达式);
示例如下:
#include <stdio.h>
int main()
{int num = 0;do{printf("%d ", num);++num;} while (num < 10);printf("\n");return 0;
}
使用细节同while语句。
for 语句
for语句的使用场景最为普遍,语法规则如下:
for (表达式1(初始化);表达式2(条件判断);表达式3(调整部分))
{//循环语句段;
}
表达式1为初始化部分,用于初始化循环变量的。
表达式2为条件判断部分,用于判断循环是否终止。
表达式3为调整部分,用于循环条件的调整。
表达式用 ; 分隔。
表达式1即初始化只会执行一次,表达式3即调整部分在循环语句段执行完后才会执行。
示例如下:
#include <stdio.h>
int main()
{int num;for (num = 0; num < 10; num++){printf("%d ", num);}printf("\n");return 0;
}
使用细节
1.非必要情况下,不要在for语句循环体内修改循环控制变量,以防止循环失去控制。
#include <stdio.h>
int main()
{int num;for (num = 0; num < 10; num++){//陷入死循环num = 1;printf("%d ", num);}printf("\n");return 0;
}
2.循环语句可以嵌套使用。
3.for循环中的初始化部分,判断部分,调整部分都是可以省略的,但是不建议初学时省略,容易导致问题。
#include <stdio.h>
int main()
{int i = 0;int j = 0;for (i = 0; i < 10; i++){//不省略初始化for (j = 0; j < 10; j++){printf("%d ", j);}printf("\n");}return 0;
}
#include <stdio.h>
int main()
{int i = 0;int j = 0;for (i = 0; i < 10; i++){//省略初始化for (; j < 10; j++){printf("%d ", j);}printf("\n");}return 0;
}
4.循环控制变量可以有多个。
#include <stdio.h>int main()
{int x, y;for (x = 0, y = 0; x < 2 && y < 5; ++x, y++){printf("hehe\n");}return 0;
}
转向语句
为了使C语言更加的灵活,祖师爷引入了转向语句。像break语句,continue语句,return语句,goto语句都是转向语句。
break 语句
break 语句用于分支语句和循环语句中,在分支语句中常与 switch语句搭配使用,在循环语句中的作用是强制永久终止本层循环(只能终止一层循环)。
#include <stdio.h>int main()
{//while循环语句int i = 0;while (i < 10){if (i == 5){break;}printf("%d ", i);i++;}printf("\n");//do...while()循环语句int j = 0;do{if (j == 5){break;}printf("%d ", j);j++;} while (j < 10);printf("\n");//for循环语句for (i = 0; i < 10; i++){if (i == 5){break;}printf("%d ", i);}printf("\n");return 0;
}
continue 语句
continue 语句用于循环语句,其作用是跳过本次循环,即跳过continue语句后面的代码,直接回到条件判断部分。
由于while循环语句和do...while()语句的循环调整部分语句也在循环体内,因此在这两个语句中使用continue语句时要格外注意,防止跳过循环调整部分的语句,否则程序会陷入死循环。for循环语句的调整部分不在循环体内,因此不用担心这个问题。
#include <stdio.h>int main()
{//while循环语句int i = 0;while (i < 10){//死循环if (i == 5){printf("%d ", i);continue;}printf("%d ", i);i++;}printf("\n");return 0;
}
#include <stdio.h>int main()
{//while循环语句int i = 0;while (i < 10){if (i == 5){//printf("%d ", i);i++;continue;}printf("%d ", i);i++;}printf("\n");return 0;
}
#include <stdio.h>int main()
{int i = 0;//for循环语句for (i = 0; i < 10; i++){if (i == 5){continue;}printf("%d ", i);}printf("\n");return 0;
}
return 语句
return 语句用来结束函数。main函数中return 0;表示程序正常结束(规定)。
goto 语句
goto语句作用是跳转到你想要去的任何地方。语法规则如下:
标号://...goto 标号;
示例如下:
#include <stdio.h>
int main()
{int i = 0;
begin:printf("%d ", i);i++;if (i < 10){goto begin;}printf("\n");return 0;
}
使用细节
在上文中我们讲到C语言是一门结构化的程序设计语言,由于goto语句用起来百无禁忌,不仅与C语言的结构化理念背道而驰,而且goto语句的滥用可能会引发各种各样的bug,从理论上来说goto语句也是没有必要的,实践中即使没有goto语句也可以很容易的写出代码。当然,在某些场景下goto语句还是有优势的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。比如:一次性跳出多层循环。
#include <stdio.h>int main()
{int i = 0;int j = 0;//for循环语句for (i = 0; i < 10; i++){printf("xixi ");for (j = 0; j < 10; j++){if (j == 2){goto begin;}printf("haha ");}printf("\n");}
begin:printf("\n");return 0;
}
相关文章:
C语言学习笔记之结构篇
C语言是一门结构化程序设计语言。在C语言看来,现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象,即顺序,分支(选择),循环。 所谓顺序就是一条路走到黑;生活中在很多事情上我们都…...
C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法
C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法 —— 2024-06-08 杭州 code review! 文章目录 C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法一.从一个函数中获取多个返回值的方法1. 使用结构体或类2. 使用`std::t…...
GDB:从零开始入门GDB
目录 1.前言 2.开启项目报错 3.GDB的进入和退出 4.GDB调试中查看代码和切换文件 5.GDB调试中程序的启动和main函数传参 6.GDB中断点相关的操作 7.GDB中的调试输出指令 8.GDB中自动输出值指令 9.GDB中的调试指令 前言 在日常开发中,调试是我们必不可少的技能。在专业…...
服务器权限管理
我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要。(权限越大,责任越大) 1.基本权限 U--user用户,G-group…...
08 SpringBoot 自定定义配置
SpringBoot自定义配置有三种方式: 使用PropertySource进行自定义配置 使用ImportResource进行自定义配置 使用Configuration进行自定义配置 PropertySource 如果将所有的配置都集中到 application.properties 或 application.yml 中,那么这个配置文…...
Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)
Java环境本身并不直接支持DESede/ECB/ZeroPadding。 不过,可以通过以下几种方式来实现DESede/ECB/ZeroPadding: 手动实现填充和去除填充:如前面示例代码所示,在加密之前进行填充,在解密之后去除填充。这是一个通用的方…...
从0开发一个Chrome插件:项目实战——广告拦截插件
前言 这是《从0开发一个Chrome插件》系列的第十七篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…...
C++ 32 之 静态成员函数
#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明,在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…...
Python闯LeetCode--第1题:两数之和
Problem: 1. 两数之和 文章目录 思路解题方法复杂度Code 思路 看到这道题第一思路就是暴力破解,枚举,两个for循环遍历,直到找到满足要求的答案。主要因题目假设只有一组满足结果的答案,因此难度大大降低,作为第一道题&…...
SSM情侣购物系统-计算机毕业设计源码02387
目 录 摘要 1 绪论 1.1 开发背景与意义 1.2开发意义 1.3Vue.js 主要功能 1.3论文结构与章节安排 2 情侣购物系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…...
09-Spark架构
相比MapReduce僵化的Map与Reduce分阶段计算,Spark计算框架更有弹性和灵活性,运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度,分割成更多的计算阶段(stage)…...
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
目标 在清晨的代码编辑器上,一场新的挑战即将开始。程序员们肃立于安静的办公室,眼神专注地盯着屏幕,等待着编译器的一声提示。 随着编译器输出的激动人心的"start!"的提示,战斗的序幕拉开了。Bug如潮水般涌来&#x…...
浅谈JavaScript中的作用域
前言 今天就来简单聊聊JavaScript中的作用域吧!!! 正文 我们都知道,在任何一门编程语言里面都是有作用域这个概念的,不然岂不乱套了 在js中的作用域一共分为三种,全局域、函数域和块级作用域 全局域 全…...
Python | C++漂移扩散方程和无风险套利公式算法微分
🎯要点 🎯漂移扩散方程计算微分 | 🎯期权无风险套利公式计算微分 | 🎯实现图结构算法微分 | 🎯实现简单正向和反向计算微分 | 🎯实现简单回归分类和生成对抗网络计算微分 | 🎯几何网格计算微分…...
python如何对list求和
如何在Python中对多个list的对应元素求和,前提是每个list的长度一样。比如:a[1,2,3],b[2,3,4],c[3,4,5],对a,b,c的对应元素…...
如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法
在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用,因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题࿰…...
算法day32
第一题 207. 课程表 步骤一: 通过下图的课程数组,首先画出DAG图(有向无环图) 步骤二: 其次我们按照DAG图,来构建该图的拓扑排序,等有效的点都按照规则排完序后,观察是否有剩下的点的入度不为0&…...
【QT】信号与槽
目录 概述 Q_OBJECT 自定义信号 自定义槽 带参数的信号和槽 信号与槽断开 定义槽函数时,使用lambda表达式 概述 所谓的信号槽,要解决的问题,就是响应用户的操作,这是QT与其他GUI开发框架比较不同的地方。其他的GUI开发框…...
【Java】解决Java报错:IllegalArgumentException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…...
完美的移动端 UI 风格让客户无可挑剔
完美的移动端 UI 风格让客户无可挑剔...
【React】在 React 组件中,怎么使用useContext
在React中,useContext 是一个Hook,它允许你无需显式地通过组件树的每一层来传递 props,就能将值深入到组件树的任何位置。要使用 useContext,你需要先创建一个 Context 对象,然后使用这个对象提供的 Provider 组件来包裹你的应用中的一部分。然后,任何在这个 Provider 下…...
【数据结构】栈的应用
目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈(Stack)是一…...
Opencv基本操作
Opencv基本操作 导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR import cv2 #opencv读取的格式是BGR import numpy import matplotlib.pyplot as plt %matplotlib inline图像读取 通过cv2.imread()来加载指定位置的图像信息。 img cv2.imread(./res/ca…...
2779. 数组的最大美丽值
简单翻译一下题目意思: 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数,区间左右是闭的。在每个数字可以替换的前提下,返回数组中最多的重复数字的数量。 第一想法是用一个哈希表,Key 是可以被替换的数…...
数据库修复实例(航线修复)
修复目标 修复回音群岛 (Echo Isles) 到 赞达拉港 (Port of Zandalar) 的航线 SET TRANSPORT_GUID : 32; SET TRANSPORT_ENTRY : 272677; SET CGUID : 850000;-- Adjust transports DELETE FROM transports WHERE guid TRANSPORT_GUID; INSERT INTO transports (guid, entry…...
视频网站下载利器yt-dlp参数详解
yt-dlp 是一个强大的命令行工具,用来下载 YouTube 和其他网站上的视频和音频。它拥有丰富的参数,可以定制下载行为,满足各种需求。本文将详细介绍 yt-dlp 的参数使用。 一、基本参数 -f, –format FORMAT: 指定下载格式,可以用视…...
可解析PHP的反弹shell方法
这里拿vulnhub-DC-8靶场反弹shell,详情见Vulnhub-DC-8 命令执行 拿nc举例 <?php echo system($_POST[cmd]); ?>利用是hackbar,POST提交cmdnc -e /bin/sh 192.168.20.128 6666, 直接反弹shell到kali。 一句话木马 <?php eval($_POST[&qu…...
AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集
AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云层下的海洋边界层水汽。AMSR-E 和 AMSR-2 的微波…...
Oracle备份失败处理,看这一篇就够了!
作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…...
后端中缓存的作用以及基于Spring框架演示实现缓存
缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…...
做网站蓝色和什么颜色搭配好看/如何建站
文章目录前言一、导入相关库二、加载Cora数据集三、定义GraphSAGE网络3.1 定义GraphSAGE层3.1.1 定义权重 W3.1.2 特征映射3.1.3 节点特征更新3.1.4 SAGEConv层3.2 定义GraphSAGE网络四、定义模型五、模型训练六、模型验证七、结果完整代码前言 大家好,我是阿光。 …...
贵阳微网站建设公司/头条站长平台
原标题:什么是工业主板,与普通主板的区别工业级主板为工业PC系统提供了支柱,与商用主板相比,它们受到版本控制,并且可用时间更长,并且通常在比商用同类产品更宽的温度范围内运行。与传统的消费类主板相反&a…...
做网站要钱吗?/百度收录怎么查询
由于项目中需要从SD卡中读取文件,为了方便操作,需要移植文件系统,源码比较容易获取的两个文件系统为FATFS和znFAT,看了一下FatFS文旦比较丰富,同时接口清晰,所以优先选择FatFS进行测试,这样在了解FatFS移植…...
流量网站应该怎么做/百度seo排名点击器
一、什么是AS(ActionScript) ActionScript,简称AS,中译为“动作脚本语言”。 用于在Flash上实现一些光用Flash无法实现的功能。 在Flash界面下的动作面板中编写AS。 二、时间轴控制命令 初识AS,首先让我们来认识一下AS…...
wordpress+php允许上传文件大小/怎么给公司做网站
1、GUI偏重功能和页面测试,应使用工具如Selenium、QTP(UFT)来完成自动化测试。 Selenium简介: 1.0核心是Selenium RC,RC Server Client Lib组成,RCServer包括Launcher、Http Proxy、Selenium Core三个部…...
摄影瀑布流网站模板/武汉seo关键字推广
$.ajax({url: "/test.php",//后台提供的接口type: "post", //请求方式是postdata:{"type":"1", //这是你要传给后台的data值"t":"c4552111"},dataType: "json", //数据类型是json型success: function (…...