C 语言简单入门

news2024/11/19 21:26:31

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.coloradmin.cn/o/1035523.html

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

相关文章

Java核心知识点整理大全5-笔记

书接上回Java核心知识点整理大全4-笔记_希斯奎的博客-CSDN博客 目录 3.4.1. HashMap&#xff08;数组链表红黑树&#xff09; 3.4.1.1. JAVA7 实现 3.4.1.2. JAVA8 实现 3.4.2. ConcurrentHashMap 3.4.2.1. Segment 段 3.4.2.2. 线程安全&#xff08;Segment 继承 ReentrantLo…

【C语言】联合体与结构体如何巧妙配合使用节省内存空间?

本篇文章目录 1. 联合体的特点2. 计算联合体占用内存大小3. 利用联合体的特点判断当前机器是以什么字节序顺序存储数据&#xff1f;4. 联合体什么时候使用&#xff1f; 1. 联合体的特点 联合也是一种特殊的自定义类型&#xff0c;这种类型定义的变量也包含一系列的成员&#x…

微软最热门的10款前端开源项目!

本文来盘点微软开源的十大前端项目&#xff0c;这些项目在 Github 上获得了超过 45 万 Star&#xff01; Visual Studio Code Visual Studio Code 是一款由微软开发的开源的代码编辑器。它支持多种编程语言&#xff0c;如C、C、C#、Python、JavaScript 和 TypeScript 等&…

Nginx 代理 MySQL 连接

文章目录 Nginx 代理 MySQL 连接1. 前言2. 部署 Nginx&#xff0c;MySQL3. ngx_stream_core_module 配置方式3.1 stream3.2 server3.3 listen3.4 配置示例 4. 限制访问 IP4.1 allow4.2 deny4.3 配置示例 5. 综合案例 Nginx 代理 MySQL 连接 原文地址&#xff1a;https://mp.wei…

Windows批处理文件 @echo off作用

bat批处理文件代码中有echo off 这样的语句&#xff0c;echo off是什么意思&#xff1f;在bat中扮演着什么作用呢&#xff1f; A&#xff1a; echo off的意思是在批处理运行命令的时候不会一条一条的显示执行的命令&#xff0c;与之相匹配的还有echo on。 echo off 与echo on …

机器视觉康耐视Visionpro-脚本编写标记标识:点,直线,矩形,圆

显示标记标识的重要作用就是,对NG或者OK对操作机器视觉的人去看到具体位置缺陷或者NG坐标。 一.点CogPointMarker CogPointMarker PointMarker1 = new CogPointMarker();//创建对象,点CogPointMarker //注意运行工具 PointMarker1.X = 100; PointMarker1

基于FPGA的16QAM调制verilog代码

名称&#xff1a;FPGA的16QAM调制verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用FPGA实现16QAM的调制&#xff0c;并进行仿真 代码下载&#xff1a;FPGA的16QAM调制verilog_Verilog/VHDL资源下载 代码网&#xff1a;hdlcode.com 部分代…

万界星空科技MES与WMS如何集成的?

传统制造业数字化转型正汹涌而来&#xff0c;要进一步提高产业发展质量&#xff0c;重塑制造业竞争优势&#xff0c;就必须加快发展数字化制造&#xff0c;加紧推动制造业的数字化转型。在这一数字化背景下&#xff0c;新一代科技技术的运用尤为重要。在具体实践中&#xff0c;…

工具及方法 - 二进制编辑软件

之前介绍过用Notepad和VSCode进行二进制文件编辑。 很多通用型的文本编辑器都会集成二进制文件编辑功能&#xff0c;或者使用插件等形式扩展此项功能。比如vi/vim等工具。 而且&#xff0c;作为文本编辑、二进制文件编辑一类的工具&#xff0c;数量众多&#xff0c;各有特色。…

msvcp140为什么会丢失?msvcp140.dll丢失的解决方法

msvcp140.dll 是一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些函数和类&#xff0c;例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2015 及以上版本中的一部分&#xff0c;用于支持 C 应用程序的运行。如果 msvcp140.dll 丢失或损坏&#xff…

redis安装问题

title: “Redis安装问题” createTime: 2022-01-04T20:47:0608:00 updateTime: 2022-01-04T20:47:0608:00 draft: false author: “name” tags: [“redis”] categories: [“install”] description: “测试的” title: redis安装可能遇到的错误 createTime: 2022-01-04T20:47…

如何在pycharm专业版使用conda虚拟环境

目 录 本文背景 前提条件 操作步骤 1.查看当前虚拟环境 2.创建一个新的虚拟环境 3.查看虚拟环境 4.切换虚拟环境 5.无依赖运行pandas代码 6.终端安装依赖 7.再次运行 本文背景 在经历了之前痛苦的环境各种报错的情况下&#xff0c;我终于知道如何有序地管理环境了 那…

SPA项目之登录注册--请求问题(POSTGET)以及跨域问题

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.ElementUI是什么 &#x1f4a1;准备工作&…

数据结构与算法-时间复杂度与空间复杂度

数据结构与算法 &#x1f388;1.概论&#x1f52d;1.1什么是数据结构&#xff1f;&#x1f52d;1.2什么是算法&#xff1f; &#x1f388;2.算法效率&#x1f52d;2.1如何衡量一个算法的好坏&#xff1f;&#x1f52d;2.2算法的复杂度&#x1f52d;2.3时间复杂度&#x1f4d6;2…

Oracle 12c自动化管理特性的新进展:自动备份、自动恢复和自动维护功能的优势|oracle 12c相对oralce 11g的新特性(3)

一、前言: 前面几期讲解了oracle 12c多租户的使用、In-Memory列存储来提高查询性能以及数据库的克隆、全局数据字典和共享数据库资源的使用 今天我们讲讲oracle 12c的另外的一个自动化管理功能新特性:自动备份、自动恢复、自动维护的功能 二、自动备份、自动恢复、自动维护…

新思路,4.9+氧化应激相关基因构建风险模型

今天给同学们分享一篇氧化应激预后模型的生信文章“Construction of an oxidative stress-related lncRNAs signature to predict prognosis and the immune response in gastric cancer”&#xff0c;这篇文章于2023年5月31日发表在Scientific Reports期刊上&#xff0c;影响因…

【LeetCode】——双指针(快慢指针)/多指针

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 前言 大家好&#xff01;这是新开的LeetCode刷题专栏&#xff0c;这个专栏不只是随便的拿一些我练过的题讲解&#xff0c;而是总结我在刷题中的一些方法适用于一大类的题&#xff0c;是给大家提供这一大类题的解题…

STL-函数对象、谓词、常用算法

函数对象 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一个函数 函数对象使用…

第一章:最新版零基础学习 PYTHON 教程(第十节 - Python 语句中的 – Python 如果否则)

在现实生活中,有时我们需要做出一些决定,并根据这些决定来决定下一步应该做什么。在编程中也会出现类似的情况,我们需要做出一些决定,并根据这些决定我们将执行下一个代码块。编程语言中的决策语句决定了程序执行流程的方向(控制流)。 Python 中的控制流类型 在Python…

计算π的近似值分数 ——python

利用格里高利公式&#xff1a; 计算 的近似值&#xff0c;直到最后一项的绝对值小于给定精度eps。 输入格式: 输入小于1且大于0的阈值。 输出格式: 输出满足阈值条件的近似圆周率&#xff0c;输出到小数点后6位。 输入样例: 在这里给出一组输入。例如&#xff1a; 0.0…