C 语言简单入门
C 语言发展历史|标准
1972年,丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Tompson)在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。
1987年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇合著的 The C Programming Language)(《C 语言程序设计》)第 1 版是公认的 C 标准,称之为 K&R C
或经典 C。
1989年,C 语言被美国国家标准协会 ANSI 标准化为 ANSI C
,其定义了 C 语言和 C 标准库。这套 C 标准也被称为 C89
。
1990年,国际标准化组织 ISO 采用了 ANSI 制定的 C 标准,改为 ISO C
。它与 ANSI C
是完全相同的。ISO C
也称为 C90
。
1994年,ANSI/ISO联合委员会发布 C99
标准。其修改如下:
- 增加 3 个新的标准库头文件:
iso646.h
、wctype.h
和wchar.h
。 - 几个新的记号与预定义宏,用于对国际化提供更好的支持。
printf/sprintf
函数一系列的格式代码。- 大量的函数与一些类型和常量,用于多字节字符和宽字节字符。
2011年,ISO 发布了 C11
标准。
C18
C2X
C 语言的特性
- 可移植性(Portability):C语言的代码在不同平台上通常可以轻松移植,这意味着您可以在不同的计算机体系结构和操作系统上运行相同的代码,只需稍作修改。这得益于C语言的抽象性和硬件无关性。
- 高性能(Performance):C语言具有卓越的性能,因为它允许程序员对计算机硬件进行更低级别的控制。这使得C语言非常适合开发需要高性能的应用程序,如系统软件、嵌入式系统和游戏引擎。
- 低级别编程(Low-Level Programming):C语言允许程序员直接操作内存和硬件资源,包括指针操作、位操作和汇编语言嵌入。这使得C语言非常适合系统编程和硬件控制。
- 可扩展性(Extensibility):C语言允许程序员编写自己的函数和库,以扩展语言的功能。这使得C语言可以应对各种不同的问题领域。
- 面向过程编程(Procedural Programming):C语言是一种面向过程的编程语言,它以函数为基本构建块,使得程序的组织和管理变得简单。
C 语言的应用领域
- 系统编程:C 语言最初设计用于 Unix 系统的开发,因此在系统内核、驱动程序和系统工具的编写中得到广泛应用。它允许程序员直接访问计算机硬件,提供了对系统资源的更好控制。
- 嵌入式系统:C 语言的低级别控制和高效性使其成为嵌入式编程的理想选择,包括微控制器、嵌入式系统-on-chip(SOC)和嵌入式软件。
- 编译器和解释器:C 语言也用于编写其他编程语言的编译器和解释器。例如 Python 的 CPython 解释器就是用 C 语言写的。
- 游戏开发:虽然游戏的高级逻辑通常由 C++ 等语言编写,但是 C 语言在游戏引擎、图形编程和性能优化等方面仍起到关键作用。许多游戏的底层引擎和系统组件都是用C语言编写的。
- 数据库系统:关系型数据库管理系统(RDBMS)如 MySQL 和 PostgreSQL 使用 C 语言进行核心开发。C 语言的性能和可移植性对数据库系统至关重要。
- 网络编程:C语言广泛用于开发网络应用程序、服务器和协议栈。它提供了对底层网络套接字编程的支持,使得开发网络应用更加灵活。
- 图形编程:C语言用于开发图形应用程序、图形库和图形用户界面(GUI)工具包。例如,GTK+和Qt这些GUI库都支持C语言。
- 科学和工程计算:C语言在科学计算、数值分析和工程领域得到广泛应用,因为它的性能非常高。许多数学库和科学计算工具都使用C语言编写。
- 金融领域:C语言在金融领域用于高性能的金融建模、算法交易和数据分析应用程序的开发。其速度和精度对于金融计算至关重要。
编译与链接
C 语言编写的源代码文件以 .c
结尾。
编译器(compiler)将源代码编译成中间代码或目标代码,最普遍的中间代码是机器语言代码,但是中间代码还不能直接运行,因为缺少启动代码和库代码。启动代码是程序与操作系统间的接口。不同操作系统的启动代码不同。
链接器最后把中间代码、系统的标准启动代码和库代码这三部分合并成一个文件:可执行文件。中间代码与可执行代码都由机器语言指令组成。
C 语言的关键字与保留标识符
K&R C标准关键字:
auto | extern | short | while |
break | float | case | for |
char | goto | static | if |
struct | continue | switch | default |
int | typedef | do | long |
union | double | register | unsigned |
else | restrict | void | return |
C89/C90 标准关键字:
- signed
- const
- enum
- volatile
C99 标准关键字:
- inline
C11 标准关键字:
_Alignas
_Alignof
_Atomic
_Bool
_Complex
_Generic
_Imaginary
_Noreturn
_Static_assert
_Thread_local
保留标识符包括那些以下划线字符开头的标识符和标准库函数名,如printf()
、scanf()
、malloc()
等。
C 语言基本数据类型
整数类型
int
int 类型是有符号整型,可以是正负整数和零,第一位为符号位。
int 类型的取值范围与计算机处理器位数相关:16位的处理器使用16位来存储一个 int 值,取值范围为 − 2 15 = 32768 到 2 15 − 1 = 32767 -2^{15} = 32768 到 2^{15} -1 = 32767 −215=32768到215−1=32767,这也是 ISO 规定的 int 最小的取值范围;32位处理器则使用32位来存储一个 int 值;还有 64 位的。
声明 int 变量:
C语言中,在数字前添加 0x 或 0X
前缀表示 16 进制,添加 0
前缀表示 8 进制。
使用 printf
库函数在控制台打印 int 变量:
%d
—转为—> 十进制整数%o
—转为—> 八进制整数%x
—转为—> 十六进制整数%#o
—显示—> 八进制整数%#x
—显示—>0x
开头十六进制整数%#X
—显示—>0X
开头十六进制整数
不止上面这些哦!
short
short 是 short int
类型的简写,其占用存储空间不比 int 多,可能相等,一般为 16 位。在某些情况下可以节省空间。
short 的打印可以使用 %hd
(十进制)、%ho
(八进制)和 %hx
(十六进制)。
long
long 是 long int
的简写,占用空间不比 int 少,一般为 32 位。适用于数值大的场合。
long 的打印可以使用 %ld
(十进制)、%lo
(八进制)和 %lx
(十六进制)。
对于 long 类型常量,后缀要加 l
或 L
。
long long
long long int
的简写,占用空间不比 long 少,至少占用 64 位。
long long 的打印可以使用 %lld
(十进制)、%llo
(八进制)和 %llx
(十六进制)。
long long 类型常量后缀要加 ll
或 LL
。
unsigned
unsigned int
的简写,表示无符号整型。
C90 中添加了 unsigned long
或 unsigned long int
,以及 unsigned short
和 unsigned short int
。
C99 中添加了 unsigned long long
或 unsigned long long int
。
有符号类型前面都省略了 signed
。加上也无妨。
常量后缀:
类型 | 后缀 |
---|---|
unsigned | %u |
unsigned long | %lu、%ul、%UL、%LU … |
unsigned long long | %llu … |
...
后面显而易见了。
字符类型:char
在C语言中,字符类型主要用于表示单个字符。C语言提供了两种主要的字符类型:char
和 wchar_t
。
char
变量通常占用一个字节的内存空间,即8位,但其确切大小和编码方式可能因不同的编译器和平台而异。
char
类型可以用来表示标准ASCII字符,包括字母、数字、标点符号和一些控制字符。
在C语言中,char
类型的变量可以用单引号括起来,例如:char ch = 'A';
。
wchar_t
是C语言中的宽字符类型,用于表示更广范围的字符,包括国际化字符集中的字符。
wchar_t
变量的大小和编码方式因平台而异,通常会比 char
大。
在C语言中,wchar_t
类型的变量可以用L
前缀和单引号括起来,例如:wchar_t wideChar = L'宽';
。
_Bool 类型
_Bool
是C语言中的一个基本数据类型,用于表示布尔值,即"真"或"假"。C99标准引入了这个数据类型,以提供对布尔逻辑的原生支持。
_Bool
类型只有两个合法的值,即 0
表示 “假”,非零值表示 “真”。通常,“假” 用 0
表示,而 “真” 可以是任何非零值,但C标准要求 _Bool
类型的实现至少能够表示 0
和 1
,因此通常用 0
表示 “假”,用 1
表示 “真”。
要使用 _Bool
类型,需要包含 <stdbool.h>
头文件。
为了更方便地使用 _Bool
,C标准库还定义了 bool
作为 _Bool
的别名。
可移植类型:stdint.h 和 inttypes.h
为了提高可移植性,C99 新增了两个头文件 stdint.h
和 inttypes.h
。
stdint.h
提供精确宽度整数类型(exact-width integer type)。例如 int32_t
表示 32 位的有符号整数,在 32 位 int 的系统中会将其作为 int 别名,而在 16 位 int、32 位 long 的系统中则会将其作为 long 的别名。但是,如果系统中并没有 32 位这么短的类型,那么这时就有问题了。
因此,C99和 C11提供了最小宽度类型(minimum width type)来解决该情况。例如,int_least8_t
是可容纳 8 位有符号整数值的类型中宽度最小的类型的一个别名。如果系统最小数据类型是 16 位,那么int_least8_t
可能被实现为 16 位。
如果你更关心数据类型的速度而非空间,那么 C99 和 C11 也定义一组可使计算达到最快的类型集合,称为最快最小宽度类型。例如 int_fast8_t
。
最后,还有最大整数类型 intmax_t
和 uintmax_t
。
这些类型都被包含在 stdint.h
中。
inttypes.h
定义了一系列的宏,用于在格式化字符串中指定不同大小和带符号性质的整数类型。这些宏通常以PRI
和SCN
开头,后面跟随整数类型的缩写,例如 PRId32
用于表示带符号32位整数的格式宏,PRIu64
用于表示无符号64位整数的格式宏。这些宏可用于 printf
和 scanf
等函数,以确保在不同平台上正确处理整数类型的输入和输出。
printf("%"PRId32"",x);
浮点类型:float、double和long double
浮点类型用于金融和数学领域的场合。
一般计数法:120.55
科学计数法:1.2055 x 10^2
指数计数法:1.2055e2
float 类型至少表示小数点后 6 位有效数字,取值范围为 1 0 − 37 至 1 0 37 10^{-37} 至 10^{37} 10−37至1037。
float 类型通常占据 32 位,采用 IEEE 754 标准来表示浮点数,其中 8 位用于表示指数的符号和值,另外 24 位用于表示尾数及其符号。
IEEE 754 是一个用于浮点数表示和计算的标准,它定义了浮点数的二进制表示方法、舍入规则以及基本算术运算规则。
让我们考虑一个单精度浮点数:0 10000010 10010000000000000000000。
IEEE 754 单精度浮点数由三个部分组成:符号位(Sign Bit)、指数部分(Exponent)、小数部分(Fraction/Mantissa)。让我们一步步来解剖这个例子:
- 符号位(Sign Bit):第一个位是符号位。0 表示正数,1 表示负数。在这个例子中,符号位是0,所以这是一个正数。
- 指数部分(Exponent):接下来的 8 位是指数部分。这个部分用于表示浮点数的指数。在 IEEE 754 中,指数采用偏移表示法,即需要减去一个偏移值来得到真实的指数。偏移值为127(单精度浮点数的情况)。所以,在这个例子中,指数部分是 10000010。要计算真实的指数,需要将它解释为二进制,然后减去偏移值:
10000010 (二进制) = 130 (十进制) 真实的指数 = 130 - 127 = 3 - 小数部分(Fraction/Mantissa):剩下的位数(23 位)组成小数部分。这个部分用于表示浮点数的精度和小数部分。在这个例子中,小数部分是 10010000000000000000000。
现在,我们有了这些部分的值,我们可以计算出这个浮点数的实际值。根据 IEEE 754 的规则,实际值可以计算为:
实际值 = (-1)^符号位 × 1.10010000000000000000000(二进制) × 2^真实的指数
在这个例子中:
- 符号位是 0,表示正数。
- 小数部分是 1.10010000000000000000000(二进制)。
- 真实的指数是 3。
现在,我们可以将这些值代入公式中来计算实际值:
实际值 = (-1)^0 × 1.10010000000000000000000 × 2^3
实际值 = 12.5(十进制)
double 是双精度浮点型,与 float 最小取值范围相同,但是最小有效数字为 10 位,double 一般占用 64 位。
long double 至少与 double 精度相同。
打印浮点值
复数与虚数类型
相关文章:
C 语言简单入门
C 语言发展历史|标准 1972年,丹尼斯里奇(Dennis Ritch)和肯汤普逊(Ken Tompson)在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年,布莱恩柯林汉(Brian Kernighanÿ…...
Levels - UE5中的建模相关
一些日常的笔记; 可以使用Shapes面板建立基础模型: 可以在PolyModel中继续细分模型: UE5中的建模有PolyGroups概念,可以在Attributes面板中直接编辑: 使用GrpPnt方式可以直接用笔刷设定新的PolyGroups,这样…...
数据中心与数据仓库的区别
在数字化时代,数据已经成为企业竞争的核心资源,数据处理和数据管理也变得越来越重要。在数据处理方面,数据中台和数据仓库是两种常见的数据处理方式,它们有着不同的特点和适用场景。本文将从技术角度对数据中台和数据仓库的区别进…...
[2023.09.18]: Rust中类型转换在错误处理中的应用解析
随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下。 Rust抽象出来了Result<T,E>,T是返回值的类型,E是错误类型。只要函数的返回值的类…...
前端工作日常
机缘 记录和遇到的问题作为记录 收获 收获代码提高和认知 日常 使用js去操作数组或者对象 空闲时间可以多学学基础算法 比如(冒泡,倒序,去重,笛卡尔积算法,各种各样的排序方法等等等) 正确良好的使用循环…...
C++:C++哪些时候用到const
声明常量:使用const关键字定义一个常量,不允许对其进行更改。例如: const int PI 3.1415926;修饰函数参数:加上const限定符可以确保函数不会修改传入的参数值。例如: void print(const int num) {// num不能在函数内…...
OpenCV之九宫格图像
将一张图像均等分成九份,然后将这九个小块按一定间隔(九宫格效果)拷贝到新画布上。效果如下图所示: 源码: #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv;i…...
OpenGLES:绘制一个颜色渐变的圆
一.概述 今天使用OpenGLES实现一个圆心是玫红色,向圆周渐变成蓝色的圆。 本篇博文的内容也是后续绘制3D图形的基础。 实现过程中,需要重点关注的点是:如何使用数学公式求得图形的顶点,以及加载颜色值。 废话不多说,…...
javascript数据类型错误造成的前端分页不准的问题
有个react项目是自己写的mock后端api,使用的是json文件模拟DB, slice函数模拟分页,但是在实际分页时,发现了分页不准的问题,现象如下: 当pageSize为5的时候(共16条数据),总共分4页&…...
[Qt]QListView 重绘实例之二:列表项覆盖的问题处理
0 环境 Windows 11Qt 5.15.2 MinGW x64 1 系列文章 简介:本系列文章,是以纯代码方式实现 Qt 控件的重构,尽量不使用 Qss 方式。 《[Qt]QListView 重绘实例之一:背景重绘》 《[Qt]QListView 重绘实例之二:列表项覆…...
Java 函数式编程思考 —— 授人以渔
引言 最近在使用函数式编程时,突然有了一点心得体会,简单说,用好了函数式编程,可以极大的实现方法调用的解耦,业务逻辑高度内聚,同时减少不必要的分支语句(if-else)。 一、函数式编…...
操作系统权限提升(二十八)之数据库提权-SQL Server 数据库安装
SQL Server 数据库安装 SQL Server介绍 SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。…...
腾讯mini项目-【指标监控服务重构-会议记录】2023-08-18
2023-08-18 会议纪要 进度 venus 的 metrics 独立分支开发venus 的 trace 修复了一些bug 返回 error 主动调用 span.end() profile 的 watemill pub/sub 和 trace 上报还原原本功能profile 的 hyperscan 的继续调研 待办 调研如何关闭otel,设置开关配置性能benc…...
如何通过axios拦截器,给除了登录请求以外,axios的所有异步请求添加JWT令牌!
在 Vue 项目中配置除了登录请求以外的所有请求的令牌,通常涉及到在请求头中添加令牌(Token)信息。这可以通过使用 Axios 或其他 HTTP 请求库来实现。以下是一般的步骤: 1. **安装 Axios**: 如果你还没有安装 Axios&a…...
Spring学习笔记9 SpringIOC注解式开发
Spring学习笔记8 Bean的循环依赖问题_biubiubiu0706的博客-CSDN博客 注解的存在主要是为了简化XML的配置.Spring6倡导全注解式开发 回顾下 注解怎么定义,注解中的属性怎么定义 注解怎么使用 通过反射机制怎么读取注解 注解的自定义 注解的使用 通过反射机制怎么读取注解 I…...
【新日标习题集】第13課 までのまとめ (discarded)
2. 学校にコンピューターがごだいあります。 这个句子好像有点问题,辞典中没有查到有「ごだい」这个单词 学校里有5台电脑。 5. わたしは英語がよくわかります。 我很懂英语。...
Java基础常考知识点(基础、集合、异常、JVM)
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! Java基础常考知识点…...
虚拟机桥接模式下没有无线网卡选项
我以为是雷电模拟器占用了网卡的缘故,但想起之前可能修改了无线网卡的某些内容,于是到网络属性里面查看。 如下所示,原来是之前我不小心把这个红箭头指向的项目取消勾选了。...
设计模式笔记
关于设计模式 1. 如何阅读本文 略 2. 面向对象程序设计简介 2.1 面向对象程序设计基础 面向对象程序设计 (Object-Oriented Programming,缩写为 OOP)是一种范式,其基本理念是将 数据块 及 与数据相关的行为 封装成为特殊的、…...
c==ubuntu+vscode debug redis7源码
新建.vscode文件夹,创建launch.json和tasks.json {"version": "0.2.0","configurations": [{"name": "C/C Launch","type": "cppdbg","request": "launch","prog…...
java字符串储存底层原理
字符串原理:原理1: 内存原理 (1)直接赋值给字符串,会把这个字符串放到常量池里,如果之后出现重复使用这个字符串的,就会直接从这个常量池中去引用,不会再去new一个字符串 (2)new出来的字符串不会重复使用,而是开辟一个新的空间存储原理2: 字符串中的""比较的是什么?…...
c++获取当前时间的字符串
代码 void getNowTimePrefix(std::string& prefix) {std::time_t nowTime;struct tm* p new tm;std::time(&nowTime);localtime_s(p, &nowTime);int year p->tm_year 1900;int month p->tm_mon 1;int day p->tm_mday;int hour p->tm_hour;int …...
【精品】通用Mapper 批量更新bug解决方案
问题描述 环境:mysql8.xmybatis3.5.13tk.mybatis4.2.3 在使用tk.mybatis做批量更新时,程序会报错,说是执行的SQL语法错误,经研究源代码发现tk.mybatis在实现批量更新时是通过多次执行update语句实现的。这本身就不符合MySQL批量…...
腾讯mini项目-【指标监控服务重构-会议记录】2023-07-06
7/6 会议记录 Profile4个步骤 解压kafka消息初始化性能事件,分析事件将数据写入kafkaRun 开始执行各stage handler 上报耗时到otel-collector。。。 // ConsumerDispatchHandler consumer // // param msg *sarama.ConsumerMessage // param consumer *databus.K…...
【React】函数式组件和类式组件的用法和逻辑
组件的使用 当应用是以多组件的方式实现,这个应用就是一个组件化的应用 注意: 组件名必须是首字母大写虚拟DOM元素只能有一个根元素虚拟DOM元素必须有结束标签 < /> 渲染类组件标签的基本流程React 内部会创建组件实例对象调用render()得到虚拟 …...
题目 1061: 二级C语言-计负均正
从键盘输入任意20个整型数,统计其中的负数个数并求所有正数的平均值。 保留两位小数 样例输入 1 2 3 4 5 6 7 8 9 10 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 样例输出 10 5.50 解题思路: 如题所示,输入20个正负数,---》求付数的个…...
数位和(C++)
系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...
[牛客复盘] 牛客周赛round13 20230924
[牛客复盘] 牛客周赛round13 20230924 总结矩阵转置置2. 思路分析3. 代码实现 小红买基金1. 题目描述2. 思路分析3. 代码实现 小红的密码修改1. 题目描述2. 思路分析3. 代码实现 小红的转账设置方式1. 题目描述2. 思路分析3. 代码实现 小红打boss1. 题目描述2. 思路分析3. 代码…...
mybatsi-MyBatis的逆向工程
mybatsi-MyBatis的逆向工程 一、前言二、创建逆向工程的步骤1.添加依赖和插件2.创建MyBatis的核心配置文件3.创建逆向工程的配置文件4.执行MBG插件的generate目标 一、前言 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支…...
转转闲鱼交易猫链接源码 支持二维码收款
最新仿二手闲置链接源码 后台一键生成链接,后台管理教程:解压源码,修改数据库config/Congig 不会可以看源码里有教程 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3...
经典网站域名/网站seo文章该怎么写
1、服务端解析: 1)使用BufferedReader 包装获得的数据,为了使连接长时间不断,必须使用while(true) 2)另外开启一个新的线程用户回复客户端,这里使用了PrintWriter 包装数据,从键盘输入数据,结…...
手机网页下载的文件在哪里找/成都网络优化托管公司
2019独角兽企业重金招聘Python工程师标准>>> 欢迎和大家交流技术相关问题: 邮箱: jiangxinnju163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/people/jiangxinn…...
定西做网站/广州seo技术优化网站seo
基于LabVIEW的S7300PLC与PC机的串口通信2011 仪 表 技 术 与 传 感 器 20115 Instrument Technique and Sensor No5LabV IEW S7- 300 PLC PC刘小丽, 张晓光(, 221116): 根据工业系统设计需求, 采用图形化编程语言 LabVI W 设计了 S7 - 300 PLC和 PC机间的串 通信介绍了使用 396…...
公众号开发的可行性/沙洋县seo优化排名价格
1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有。我只提几点: 写SQL:写SQL很常考察group by、内连接和外连接。手写代码:手写代码一般考单例、排序、线程、消费者生产者。我建议排序算法除了冒泡排序,…...
重庆奉节网站建设公司哪家好/廊坊seo
偶然看到<C#中判断空字符串的3种方法性能分析 >作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.28 写的一篇关于字符串为空判断方法的性能分析文章,实验结果作者已经给出,结论是使用.length0判断的效率最高…...
华润集团网站建设商/平台app开发制作
对于这一问题,相信不少人会理解为:我应当选择哪一种更好的编程语言?我应当选择哪一个软件框架?我应当进入哪一个软件行业子领域?等等。但这些都不是作者想问的。不论选择什么样的语言、库、框架乃至领域,我…...