C语言复习概要(一)
本文
- C语言入门详解:从基础概念到分支与循环
- 1. C语言常见概念
- 1.1 程序的基本结构
- 1.2 变量作用域和存储类
- 1.3 输入输出
- 1.4 编译与运行
- 2. C语言中的数据类型和变量
- 2.1 基本数据类型
- 2.2 变量的声明与初始化
- 2.3 常量与枚举
- 3. C语言的分支结构
- 3.1 if语句
- 3.2 if-else语句
- 3.3 嵌套if语句
- 3.4 switch语句
- 4.2 while循环
- 4.3 do-while循环
- 4.4 循环的控制语句
- 5. 分支与循环的综合应用
- 5.1 简单的计算器示例
- 5.2 查找数组中的最大值
- 总结
C语言入门详解:从基础概念到分支与循环
C语言作为现代编程语言的鼻祖之一,在系统编程、嵌入式开发、操作系统内核等领域占据了极其重要的位置。C语言以其简洁、高效、可移植性等特点,成为了很多其他高级语言(如C++、Java、Python)的基础。本文将深入探讨C语言的常见概念、变量和数据类型、分支结构以及循环结构,帮助初学者更好地掌握这门经典编程语言。
1. C语言常见概念
在学习任何编程语言之前,理解其核心概念至关重要。C语言的程序结构、函数、变量作用域、输入输出、编译运行等内容构成了其基本框架。
1.1 程序的基本结构
C语言的程序是由函数和语句组成的模块化代码集合,每个C语言程序至少有一个主函数,即main()
函数。程序从main()
函数开始执行,当程序结束时返回一个整数值,通常是0
,表示程序成功运行。
基本结构:
#include <stdio.h> // 标准输入输出头文件int main() {// 主函数体printf("Hello, World!\n");return 0;
}
#include <stdio.h>
:这是一个预处理指令,用于引入标准输入输出库,该库包含printf()
和scanf()
等常用函数。int main()
:这是程序的主函数,程序的执行从这里开始。返回类型int
表明函数返回整数值。printf()
:这是一个输出函数,能够将字符串或变量值输出到控制台。
1.2 变量作用域和存储类
在C语言中,变量的作用域决定了它的可见性和生命周期,通常分为局部变量和全局变量。局部变量只能在其声明的代码块内访问,而全局变量可以在整个程序中访问。
- 局部变量:在函数或代码块内定义,函数执行结束时,局部变量被销毁。
- 全局变量:在所有函数外部定义,可以在整个程序中访问。
存储类描述了变量的生命周期、初始值和存储方式,主要有以下几种:
- auto:默认的局部变量存储类。
- extern:用于声明一个全局变量或函数在其他文件中定义。
- static:用于局部变量时,其值在函数结束后不会被销毁,用于全局变量时,其作用域限制在当前文件中。
- register:提示编译器将变量存储在CPU寄存器中,以提高访问速度。
示例:
#include <stdio.h>int globalVar = 10; // 全局变量void func() {int localVar = 5; // 局部变量printf("Local variable: %d\n", localVar);
}int main() {func();printf("Global variable: %d\n", globalVar);return 0;
}
在这个示例中,globalVar
是一个全局变量,localVar
是局部变量。全局变量的值可以在程序的不同部分访问,而局部变量只能在函数func()
中使用。
1.3 输入输出
C语言提供了丰富的输入输出功能。printf()
用于向屏幕输出数据,scanf()
用于从用户获取输入。
printf()
:格式化输出,用法类似于打印字符串或变量。scanf()
:用于获取用户的输入,按格式指定的变量存储输入值。
代码示例:
#include <stdio.h>int main() {int age;printf("Enter your age: ");scanf("%d", &age);printf("Your age is: %d\n", age);return 0;
}
程序会提示用户输入年龄,然后通过scanf()
将用户的输入值存储在变量age
中,并使用printf()
输出。
1.4 编译与运行
C语言是编译型语言,这意味着源代码需要通过编译器翻译成机器代码才能在计算机上执行。常见的C语言编译器有GCC(GNU Compiler Collection)、Clang、MSVC等。
编译流程:
- 编写源代码并保存为
.c
文件。 - 使用编译器进行编译,如
gcc
命令:gcc program.c -o program
。 - 生成可执行文件,运行该文件:
./program
。
2. C语言中的数据类型和变量
C语言的数据类型定义了变量可以存储的值的类型和范围。每种数据类型都有特定的存储需求和表示方式。
2.1 基本数据类型
C语言中的数据类型分为以下几类:
- 整型(
int
):用于存储整数。常见的整型有int
、short
、long
,可以通过unsigned
修饰符表示无符号整型。 - 字符型(
char
):用于存储单个字符,占用1个字节。 - 浮点型(
float
):用于存储小数,占用4个字节,精度较低。 - 双精度浮点型(
double
):精度高于float
,占用8个字节。 - 布尔型:虽然C语言没有专门的布尔类型,但我们通常使用整型,
0
表示false
,非零值表示true
。
数据类型表:
数据类型 | 存储大小 | 取值范围 |
---|---|---|
char | 1字节 | -128 到 127 或 0 到 255 |
int | 2或4字节 | -32,768 到 32,767 或 -2^31 到 2^31-1 |
float | 4字节 | 1.2E-38 到 3.4E+38 |
double | 8字节 | 2.3E-308 到 1.7E+308 |
short | 2字节 | -32,768 到 32,767 |
long | 8字节 | -2^63 到 2^63-1 |
2.2 变量的声明与初始化
在C语言中,变量在使用之前必须先声明。声明变量时需要指定其类型,且可以在声明的同时为其赋初值。
- 变量声明:告诉编译器该变量的类型和名称。
- 变量初始化:为变量赋初值,防止未初始化变量的使用可能导致程序行为异常。
示例:
#include <stdio.h>int main() {int age = 25; // 声明并初始化变量float weight = 70.5;char grade = 'A';printf("Age: %d, Weight: %.1f, Grade: %c\n", age, weight, grade);return 0;
}
这里我们定义了整型、浮点型和字符型变量,并进行了初始化。
2.3 常量与枚举
在C语言中,常量的值在程序执行过程中是不可更改的,使用const
关键字定义常量。枚举(enum
)是一种用户定义的数据类型,用于表示一组相关的常量。
常量示例:
#include <stdio.h>int main() {const int DAYS_IN_WEEK = 7;printf("There are %d days in a week.\n", DAYS_IN_WEEK);return 0;
}
枚举示例:
#include <stdio.h>enum Weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};int main() {enum Weekday today;today = Wednesday;printf("Today is day %d of the week.\n", today); // 输出3return 0;
}
在上述程序中,枚举类型Weekday
定义了7个常量,分别代表一周中的天数。
3. C语言的分支结构
分支结构使得程序可以根据条件执行不同的代码路径。在C语言中,常见的分支结构包括if
语句、if-else
语句、嵌套if
语句和switch
语句。
3.1 if语句
if
语句是最基本的分支结构,它根据条件表达式的真假来决定是否执行某段代码。
语法:
if (条件) {// 如果条件为真,执行这段代码
}
示例:
#include <stdio.hint main() {int number = 10;if (number > 0) {printf("The number is positive.\n");}return 0;
}
在这个示例中,程序根据number
的值决定是否输出正数。
3.2 if-else语句
if-else
语句在条件为假时执行另一个代码块。
语法:
if (条件) {// 如果条件为真,执行这段代码
} else {// 如果条件为假,执行这段代码
}
示例:
#include <stdio.h>int main() {int number = -5;if (number >= 0) {printf("The number is non-negative.\n");} else {printf("The number is negative.\n");}return 0;
}
这个程序根据number
的值判断它是非负数还是负数。
3.3 嵌套if语句
当多个条件需要嵌套判断时,可以使用嵌套if
语句。它可以有效地处理复杂的条件。
示例:
#include <stdio.h>int main() {int number = 0;if (number > 0) {printf("The number is positive.\n");} else if (number < 0) {printf("The number is negative.\n");} else {printf("The number is zero.\n");}return 0;
}
这里,程序根据number
的值进行三重判断,并输出相应的信息。
3.4 switch语句
switch
语句适合用于多个可能的值来控制执行路径。相比多个if-else
语句,switch
结构更具可读性。
语法:
switch (变量或表达式) {case 值1:// 当变量等于值1时执行break;case 值2:// 当变量等于值2时执行break;default:// 默认执行
}
示例:
#include <stdio.h>int main() {int day = 3;switch (day) {case 1:printf("Monday\n");break;case 2:printf("Tuesday\n");break;case 3:printf("Wednesday\n");break;case 4:printf("Thursday\n");break;case 5:printf("Friday\n");break;case 6:printf("Saturday\n");break;case 7:printf("Sunday\n");break;default:printf("Invalid day\n");}return 0;
}在这个例子中,根据变量`day`的值,`switch`语句会打印对应的星期几。如果值不在1到7之间,默认会打印“Invalid day”。---#### 4. C语言中的循环结构循环是编程中的重要控制结构,用于重复执行一段代码。C语言中常见的循环结构有`for`循环、`while`循环和`do-while`循环。##### 4.1 for循环`for`循环用于在已知循环次数的情况下执行循环,它将初始化、条件判断和迭代操作结合在一起。**语法**:```c
for (初始化; 条件; 迭代) {// 循环体
}
示例:
#include <stdio.h>int main() {for (int i = 0; i < 5; i++) {printf("i = %d\n", i);}return 0;
}
在这个例子中,for
循环将变量i
从0
增加到4
,并在每次迭代中输出i
的值。
4.2 while循环
while
循环在条件为真时反复执行循环体,适合用于循环次数不确定的情况。
语法:
while (条件) {// 循环体
}
示例:
#include <stdio.h>int main() {int i = 0;while (i < 5) {printf("i = %d\n", i);i++;}return 0;
}
这个程序与for
循环类似,但使用了while
循环来逐步增加i
的值。
4.3 do-while循环
do-while
循环和while
循环类似,但它至少会执行一次循环体,因为条件是在循环体执行之后才进行判断的。
语法:
do {// 循环体
} while (条件);
示例:
#include <stdio.h>int main() {int i = 0;do {printf("i = %d\n", i);i++;} while (i < 5);return 0;
}
即使初始值为i = 0
,do-while
循环也会先执行循环体,然后再检查条件是否成立。
4.4 循环的控制语句
在C语言中,控制循环执行过程的语句包括break
、continue
和goto
:
- break:用于立即终止循环,跳出当前循环体。
- continue:跳过当前迭代的剩余部分,进入下一次迭代。
- goto:一种直接跳转到程序中指定标签的语句,尽量避免使用,容易导致程序难以调试和理解。
示例:使用break
和continue
:
#include <stdio.h>int main() {for (int i = 0; i < 10; i++) {if (i == 5) {break; // 当i为5时,终止循环}if (i % 2 == 0) {continue; // 跳过偶数}printf("i = %d\n", i);}return 0;
}
这个程序会输出奇数并在i
等于5
时终止循环。
5. 分支与循环的综合应用
在编写实际的C语言程序时,往往会结合使用分支结构和循环结构,以实现更复杂的逻辑处理。
5.1 简单的计算器示例
一个基本的计算器程序,可以根据用户的输入进行加法、减法、乘法和除法运算,结合了分支结构和循环结构。
示例:
#include <stdio.h>int main() {char op;double num1, num2;while (1) {printf("Enter operator (+, -, *, /) or 'q' to quit: ");scanf(" %c", &op);if (op == 'q') {break;}printf("Enter two numbers: ");scanf("%lf %lf", &num1, &num2);switch (op) {case '+':printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);break;case '-':printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);break;case '*':printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);break;case '/':if (num2 != 0) {printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);} else {printf("Error! Division by zero.\n");}break;default:printf("Invalid operator.\n");}}return 0;
}
这个程序允许用户输入一个算术运算符和两个操作数,然后根据用户的选择进行运算,直到用户输入'q'
退出程序。
5.2 查找数组中的最大值
结合分支结构和循环结构,我们还可以编写一个查找数组中最大值的程序。
示例:
#include <stdio.h>int main() {int n, i, max;printf("Enter number of elements: ");scanf("%d", &n);int arr[n];printf("Enter %d integers: ", n);for (i = 0; i < n; i++) {scanf("%d", &arr[i]);}max = arr[0]; // 假设第一个元素为最大值for (i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}}printf("The maximum value is: %d\n", max);return 0;
}
该程序通过for
循环遍历数组中的每个元素,并使用if
语句比较当前元素与最大值,最后输出数组中的最大值。
总结
本文详细介绍了C语言的常见概念、数据类型、变量的声明与初始化、分支结构以及循环结构,并通过多个代码示例展示了如何使用这些基本构件编写C语言程序。通过学习这些内容,初学者能够更好地理解C语言的基本结构和逻辑控制,为后续的高级编程技巧打下坚实的基础。
C语言的简单性和灵活性使其成为计算机科学中的核心编程语言。掌握了本文介绍的内容后,建议继续深入学习指针、数组、结构体、函数等高级话题,进一步提高编程能力。
相关文章:

C语言复习概要(一)
本文 C语言入门详解:从基础概念到分支与循环1. C语言常见概念1.1 程序的基本结构1.2 变量作用域和存储类1.3 输入输出1.4 编译与运行 2. C语言中的数据类型和变量2.1 基本数据类型2.2 变量的声明与初始化2.3 常量与枚举 3. C语言的分支结构3.1 if语句3.2 if-else语句…...

二、kafka生产与消费全流程
一、使用java代码生产、消费消息 1、生产者 package com.allwe.client.simple;import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.pr…...

本地搭建OnlyOffice在线文档编辑器结合内网穿透实现远程协作
文章目录 前言1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 前言 本篇文章讲解如何使用Docker在本地Linux服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问本地部署的文档编辑器与远程协作。 Community Editi…...

ScrapeGraphAI 大模型增强的网络爬虫
在数据驱动的动态领域,从在线资源中提取有价值的见解至关重要。从市场分析到学术研究,对特定数据的需求推动了对强大的网络抓取工具的需求。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线…...

PDF转换为TIF,JPG的一个简易工具(含下载链接)
目录 0.前言: 1.工具目录 2.工具功能(效果),如何运行 效果 PDF转换为JPG(带颜色) PDF转换为TIF(LZW形式压缩,可以显示子的深浅) PDF转换为TIF(CCITT形…...

Wireshark 解析QQ、微信的通信协议|TCP|UDP
写在前面 QQ,微信这样的聊天软件。我们一般称为im,Instant Messaging,即时通讯系统。那大家会不会有疑问,自己聊天内容会不会被黑客或者不法分子知道?这种体量的im是基于tcp还是udp呢?这篇文章我们就来探索…...
网络编程(5)——模拟伪闭包实现连接的安全回收
六、day6 今天学习如何利用C11模拟伪闭包实现连接的安全回收,之前的异步服务器为echo模式,但存在安全隐患,在极端情况下客户端关闭可能会导致触发写和读回调函数,二者都进入错误处理逻辑,进而造成二次析构。今天学习如…...

C#绘制动态曲线
前言 用于实时显示数据动态曲线,比如:SOC。 //用于绘制动态曲线,可置于定时函数中,定时更新数据曲线 void DrawSocGraph() {double f (double)MainForm.readData[12]; //display datachart1.Series[0].Points.Add(f);if (ch…...
用Python实现运筹学——Day 10: 线性规划的计算机求解
一、学习内容 1. 使用 Python 的 scipy.optimize.linprog 进行线性规划求解 scipy.optimize.linprog 是 Python 中用于求解线性规划问题的函数。它实现了单纯形法、内点法等算法,能够处理求解最大化或最小化问题,同时满足线性约束条件。 线性规划问题的…...

[C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过
官方框架: https://github.com/ultralytics/ultralytics yolov8官方最近推出yolov11框架,标志着目标检测又多了一个检测利器,于是尝试在windows下部署yolov11的tensorrt模型,并最终成功。 重要说明:安装环境视为最基…...
霍夫曼树及其与B树和决策树的异同
霍夫曼树是一种用于数据压缩的二叉树结构,通常应用于霍夫曼编码算法中。它的主要作用是通过对符号进行高效编码,减少数据的存储空间。霍夫曼树在压缩领域扮演着重要角色,与B树、决策树等数据结构都有一些相似之处,但又在应用场景和…...

CompletableFuture常用方法
一、获得结果和触发计算 1.获取结果 (1)public T get() public class CompletableFutureAPIDemo{public static void main(String[] args) throws ExecutionException, InterruptedException{CompletableFuture<String> completableFuture Com…...

本地化测试对游戏漏洞修复的影响
本地化测试在游戏开发的质量保证过程中起着至关重要的作用,尤其是在修复bug方面。当游戏为全球市场做准备时,它们通常会被翻译和改编成各种语言和文化背景。这种本地化带来了新的挑战,例如潜在的语言错误、文化误解,甚至是不同地区…...
使用rust实现rtsp码流截图
中文互联网上的rust示例程序源码还是太稀少,找资料很是麻烦,下面是自己用业余时间开发实现的一个对批量rtsp码流源进行关键帧截图并存盘的rust demo源码记录。 要编译这个源码需要先安装vcpkg,然后用vcpkg install ffmpeg安装最新版本的ffmpe…...

Cpp::STL—string类的模拟实现(12)
文章目录 前言一、string类各函数接口总览二、默认构造函数string(const char* str "");string(const string& str);传统拷贝写法现代拷贝写法 string& operator(const string& str);传统赋值构造现代赋值构造 ~string(); 三、迭代器相关函数begin &…...
一文搞懂SentencePiece的使用
目录 1. 什么是 SentencePiece?2. SentencePiece 基础概念2.1 SentencePiece 的工作原理2.2 SentencePiece 的优点 3. SentencePiece 的使用3.1 安装 SentencePiece3.2 训练模型与加载模型3.3 encode(高频)3.4 decode(高频&#x…...
一个简单的摄像头应用程序1
这个Python脚本实现了一个基于OpenCV的简单摄像头应用,我们在原有的基础上增加了录制视频等功能,用户可以通过该应用进行拍照、录制视频,并查看已拍摄的照片。以下是该脚本的主要功能和一些使用时需要注意的事项: 功能 拍照: 用户可以通过点击界面上的“拍照”按钮或按…...

通过PHP获取商品详情
在电子商务的浪潮中,数据的重要性不言而喻。商品详情信息对于电商运营者来说尤为宝贵。PHP,作为一种广泛应用的服务器端脚本语言,为我们提供了获取商品详情的便捷途径。 了解API接口文档 开放平台提供了详细的API接口文档。你需要熟悉商品详…...

【Android】获取备案所需的公钥以及签名MD5值
目录 重要前提 获取签名MD5值 获取公钥 重要前提 生成jks文件以及gradle配置应用该文件。具体步骤请参考我这篇文章:【Android】配置Gradle打包apk的环境_generate signed bundle or apk-CSDN博客 你只需要从头看到该文章的配置build.gradle(app&…...

看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?
看视频都喜欢看高清,那么一般来说看电影不卡顿需要多大带宽呢? 以4K为例,这里引用一位网友的回答:“视频分辨率4092*2160,每个像素用红蓝绿三个256色(8bit)的数据表示,视频帧数为60fps,那么一秒钟画面的数据量是:4096*2160*3*8*60≈11.9Gbps。此外声音大概是视频数据量…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...