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 标准。其修改如下:

  1. 增加 3 个新的标准库头文件:iso646.hwctype.hwchar.h
  2. 几个新的记号与预定义宏,用于对国际化提供更好的支持。
  3. printf/sprintf 函数一系列的格式代码。
  4. 大量的函数与一些类型和常量,用于多字节字符和宽字节字符。

2011年,ISO 发布了 C11 标准。

C18

C2X

C 语言的特性

  1. 可移植性(Portability):C语言的代码在不同平台上通常可以轻松移植,这意味着您可以在不同的计算机体系结构和操作系统上运行相同的代码,只需稍作修改。这得益于C语言的抽象性和硬件无关性。
  2. 高性能(Performance):C语言具有卓越的性能,因为它允许程序员对计算机硬件进行更低级别的控制。这使得C语言非常适合开发需要高性能的应用程序,如系统软件、嵌入式系统和游戏引擎。
  3. 低级别编程(Low-Level Programming):C语言允许程序员直接操作内存和硬件资源,包括指针操作、位操作和汇编语言嵌入。这使得C语言非常适合系统编程和硬件控制。
  4. 可扩展性(Extensibility):C语言允许程序员编写自己的函数和库,以扩展语言的功能。这使得C语言可以应对各种不同的问题领域。
  5. 面向过程编程(Procedural Programming):C语言是一种面向过程的编程语言,它以函数为基本构建块,使得程序的组织和管理变得简单。

C 语言的应用领域

  1. 系统编程:C 语言最初设计用于 Unix 系统的开发,因此在系统内核、驱动程序和系统工具的编写中得到广泛应用。它允许程序员直接访问计算机硬件,提供了对系统资源的更好控制。
  2. 嵌入式系统:C 语言的低级别控制和高效性使其成为嵌入式编程的理想选择,包括微控制器、嵌入式系统-on-chip(SOC)和嵌入式软件。
  3. 编译器和解释器:C 语言也用于编写其他编程语言的编译器和解释器。例如 Python 的 CPython 解释器就是用 C 语言写的。
  4. 游戏开发:虽然游戏的高级逻辑通常由 C++ 等语言编写,但是 C 语言在游戏引擎、图形编程和性能优化等方面仍起到关键作用。许多游戏的底层引擎和系统组件都是用C语言编写的。
  5. 数据库系统:关系型数据库管理系统(RDBMS)如 MySQL 和 PostgreSQL 使用 C 语言进行核心开发。C 语言的性能和可移植性对数据库系统至关重要。
  6. 网络编程:C语言广泛用于开发网络应用程序、服务器和协议栈。它提供了对底层网络套接字编程的支持,使得开发网络应用更加灵活。
  7. 图形编程:C语言用于开发图形应用程序、图形库和图形用户界面(GUI)工具包。例如,GTK+和Qt这些GUI库都支持C语言。
  8. 科学和工程计算:C语言在科学计算、数值分析和工程领域得到广泛应用,因为它的性能非常高。许多数学库和科学计算工具都使用C语言编写。
  9. 金融领域:C语言在金融领域用于高性能的金融建模、算法交易和数据分析应用程序的开发。其速度和精度对于金融计算至关重要。

编译与链接

C 语言编写的源代码文件以 .c 结尾。

在这里插入图片描述

编译器(compiler)将源代码编译成中间代码或目标代码,最普遍的中间代码是机器语言代码,但是中间代码还不能直接运行,因为缺少启动代码和库代码。启动代码是程序与操作系统间的接口。不同操作系统的启动代码不同。

链接器最后把中间代码、系统的标准启动代码和库代码这三部分合并成一个文件:可执行文件。中间代码与可执行代码都由机器语言指令组成。

C 语言的关键字与保留标识符

K&R C标准关键字:

autoexternshortwhile
breakfloatcasefor
chargotostaticif
structcontinueswitchdefault
inttypedefdolong
uniondoubleregisterunsigned
elserestrictvoidreturn

C89/C90 标准关键字:

  1. signed
  2. const
  3. enum
  4. volatile

C99 标准关键字:

  1. inline

C11 标准关键字:

  1. _Alignas
  2. _Alignof
  3. _Atomic
  4. _Bool
  5. _Complex
  6. _Generic
  7. _Imaginary
  8. _Noreturn
  9. _Static_assert
  10. _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=327682151=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 类型常量,后缀要加 lL

long long

long long int 的简写,占用空间不比 long 少至少占用 64 位

long long 的打印可以使用 %lld(十进制)、%llo(八进制)和 %llx(十六进制)。

long long 类型常量后缀要加 llLL

unsigned

unsigned int 的简写,表示无符号整型。

C90 中添加了 unsigned longunsigned long int ,以及 unsigned shortunsigned short int

C99 中添加了 unsigned long longunsigned long long int

有符号类型前面都省略了 signed。加上也无妨。

常量后缀:

类型后缀
unsigned%u
unsigned long%lu、%ul、%UL、%LU …
unsigned long long%llu …

...后面显而易见了。

字符类型:char

在C语言中,字符类型主要用于表示单个字符。C语言提供了两种主要的字符类型:charwchar_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 类型的实现至少能够表示 01,因此通常用 0 表示 “假”,用 1 表示 “真”。

要使用 _Bool 类型,需要包含 <stdbool.h> 头文件。

为了更方便地使用 _Bool,C标准库还定义了 bool 作为 _Bool 的别名。

可移植类型:stdint.h 和 inttypes.h

为了提高可移植性,C99 新增了两个头文件 stdint.hinttypes.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_tuintmax_t

这些类型都被包含在 stdint.h 中。

inttypes.h 定义了一系列的宏,用于在格式化字符串中指定不同大小和带符号性质的整数类型。这些宏通常以PRISCN开头,后面跟随整数类型的缩写,例如 PRId32 用于表示带符号32位整数的格式宏,PRIu64 用于表示无符号64位整数的格式宏。这些宏可用于 printfscanf 等函数,以确保在不同平台上正确处理整数类型的输入和输出。

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} 10371037

float 类型通常占据 32 位,采用 IEEE 754 标准来表示浮点数,其中 8 位用于表示指数的符号和值,另外 24 位用于表示尾数及其符号。

IEEE 754 是一个用于浮点数表示和计算的标准,它定义了浮点数的二进制表示方法、舍入规则以及基本算术运算规则。

让我们考虑一个单精度浮点数:0 10000010 10010000000000000000000。

IEEE 754 单精度浮点数由三个部分组成:符号位(Sign Bit)、指数部分(Exponent)、小数部分(Fraction/Mantissa)。让我们一步步来解剖这个例子:

  1. 符号位(Sign Bit):第一个位是符号位。0 表示正数,1 表示负数。在这个例子中,符号位是0,所以这是一个正数。
  2. 指数部分(Exponent):接下来的 8 位是指数部分。这个部分用于表示浮点数的指数。在 IEEE 754 中,指数采用偏移表示法,即需要减去一个偏移值来得到真实的指数。偏移值为127(单精度浮点数的情况)。所以,在这个例子中,指数部分是 10000010。要计算真实的指数,需要将它解释为二进制,然后减去偏移值:
    10000010 (二进制) = 130 (十进制) 真实的指数 = 130 - 127 = 3
  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 精度相同。

打印浮点值

复数与虚数类型

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库基础理论

什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录&#xff0c;可以是数字、文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;他们都是可以经过数字化后存入计算机。 数据库&#xff1a;存储数据的仓库&#xff0c;是长期存放在计算机内、…

世界前沿技术发展报告2023《世界信息技术发展报告》(三)量子信息技术

&#xff08;三&#xff09;量子信息技术 1. 概述2. 量子计算2.1 阿里巴巴达摩院成功研制两比特量子芯片&#xff0c;单比特操控精度超99.97%2.2 加拿大Xanadu公司开发出可编程光量子计算机2.3 美国英伟达公司为经典-量子混合计算推出开发架构2.4 日本国家自然科学研究所开发出…

SpringBoot实战

ISBN: 978-7-115-43314-5 作者&#xff1a;【美】Craig Walls 译者&#xff1a;丁雪丰 页数&#xff1a;209页 阅读时间&#xff1a;2022-12-27 推荐指数&#xff1a;★★★☆☆ 阅读本书还是要有一定的基础的&#xff0c;如果想要入门级还是不行&#xff0c; 建议入门级可以看…

python+nodejs+php+springboot+vue 法律知识分享科普系统平台

在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 要想实现法律知…

数字图像基础,数字图像处理中的基础内容(数字图像处理概念 P2)

文章目录 人类视觉系统构造数字图像生成采样和量化像素之间的基本关系 人类视觉系统构造 锥状体&#xff1a;明亮的视野杆状体&#xff1a;微光或暗视野图像成像原理&#xff1a;类似照相机亮度适应现象&#xff1a;人的视觉不能同时在一个范围内工作同时对比现象&#xff1a;…

el-select的某一项选中后显示id

环境: vue3element-plus 今天在使用elementui的下拉组件的时候发现有一个选项在选中后显示的是id.找了会没看到问题,后来想到会不会是没有设置key的原因(之前看到说vue3可以不用设置key),果然加上key就可以了

变量、因子、缺失值、类型转换、剔除多余变量、随机抽样、用R使用SQL、trim、na.rm=TRUE、数据标准化应用

变量&#xff1a;名义型、有序型、连续型变量 名义型&#xff1a;普通事件类型&#xff0c;如糖尿病I型和糖尿病II型。 有序型&#xff1a;有顺序的事件类型&#xff0c;如一年级、二年级和三年级。 连续型&#xff1a;表示有顺序的数量&#xff0c;如年龄。 因子&#xff1a;…

基于Python+Django的热门旅游景点数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

C++项目:仿muduo库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识&#xff08;一&#xff09;HTTP服务器1.概念 &#xff08;二&#xff09;Reactor模型&#xff1a;1.概念2.分类&#xff08;1&#xff09;单Reactor单线程&#xff1a;单I/O多路复用业务处理。&#xff08;2&#xff09;单Reactor多线程&…

ultraEdit正则匹配多行(xml用)

在ultraEdit中&#xff0c;我想选取<channel到</channel>之间的多行&#xff08;进行删除&#xff09;。在perl模式下&#xff0c;命令为“<channel[\s\S]?</channel>”。下面是xml文件&#xff1a; <!--This XML file does not appear to have any sty…

在北京多有钱能称为富

背景 首先声明&#xff0c;此讨论仅限个人的观点&#xff0c;因为我本身不富嘛&#xff0c;所以想法应该非常局限。 举个栗子 富二代问我朋友&#xff0c;100~1000w之间&#xff0c;推荐一款车&#xff1f; 一开始听到这个问题的时候&#xff0c;有被唬住&#xff0c;觉得预…

Linux知识

文章目录 一、Apt1、查看操作系统信息2、换源3、比较4、用法5、ubuntu获取源码 二、pkg-config三、调试glibc四、问题 一、Apt 1、查看操作系统信息 使用以下命令查看本机的操作系统和位数信息&#xff1a; uname -m && cat /etc/*release输出&#xff1a; x86_64 D…

多线程带来的的风险-线程安全

多线程带来的的风险-线程安全 ~~ 多线程编程中,最难的地方,也是一个最重要的地方&#xff0c;还是一个最容易出错的地方,更是一个面试中特别爱考的地方.❤️❤️❤️ 线程安全的概念 万恶之源,罪魁祸首是多线程的抢占式执行,带来的随机性.~~&#x1f615;&#x1f615;&…

API(十)时间相关的SDK

一 时间相关的SDK ① 时间记录的必要性 1、案发现场的时间点2、通过时间判断性能3、时间的不准确性,日志落盘时间 --> 缓冲区导致延迟 ② 使用哪些日期和时间的函数 1、lua 标准时间函数,函数 os.time、os.date 和 os.difftime 提供了所有日期和时间2、在 openresty…

windows 深度学习环境部署

1. 根据显卡配置安装适合的CUDA,查看显卡配置可在显卡控制面板上查看,安装是否成功可通过nvidia-smi查看&#xff1b;注意安装路径 https://developer.nvidia.com/cuda-toolkit-archive 2. 根据cuda安装合适的cudnn&#xff0c;需要注册NVIDIA cuDNN Archive | NVIDIA Devel…

自定义数据类型

前言&#xff1a;小伙伴们又见面啦&#xff0c;今天这篇文章&#xff0c;我们来谈谈几种自定义数据类型。 目录 一.都有哪些自定义数据类型 二.结构体 结构体内存对齐 1.如何对齐 2.为什么要对齐 3.节省空间和提升效率的方法 &#xff08;1&#xff09;让占用空间小的成员…

Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例

Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例 第23章 多功能文档查看器实例23.1. 简介23.2. 界面与程序框架设计23.2.1. 图片资源23.2.2. 网页资源23.2.3. 测试用文件 23.3 主程序代码框架23.4 浏览网页功能实现23.4.1 实现HtmIHandler处理器 23.5. 部分代码实现23.5…

AI 编码助手 Codewhisperer 安装步骤和使用初体验

文章作者&#xff1a;为了自己加油 最近亚⻢逊云科技推出了一款基于机器学习的AI编程助手 Amazon Code Whisperer&#xff0c;可以实时提供代码建议。在编写代码时&#xff0c;它会自动根据现有的代码和注释给出建议。Amazon Code Whisperer与 GitHub Copilot 类似&#xff0c;…

Vite的安装与使用

Vite也是前端的构建工具&#xff0c;相较于Webpack&#xff0c;Vite使用了不同的运行方式&#xff1a; 开发时并不对项目进行打包&#xff0c;而是直接采用ESM的方式来运行项目。在项目部署时再进行打包。 因此vite的执行速度相较于Webpack快了许多&#xff0c;操作起来也比W…

SQL中:提示不允许修改表结构,如何更改

SQL&#xff1a;不允许修改表结构 步骤图例注意 步骤 选择菜单栏中的“工具”-“选项”&#xff0c;在选项对话框左栏中找到“设计器”&#xff0c;在设计器右边取消勾选“阻止保存要求重新创建表的更改”即可。 图例 注意 设计表时&#xff0c;尽量一次性设计成功&#xff…