惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
爱范儿
爱范儿
博客园 - 【当耐特】
雷峰网
雷峰网
S
SegmentFault 最新的问题
美团技术团队
Blog — PlanetScale
Blog — PlanetScale
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
J
Java Code Geeks

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗?
C 学习笔记(一)
Dejavu Moe · 2019-10-10 · via Dejavu's Blog

简介

C 语言是一种 通用 的、面向过程 的计算机程序设计语言,具有 高效灵活功能丰富表达力强 和较高的 可移植性 等特点。

它最初是 1972 年,贝尔实验室的丹尼斯·里奇 (Dennis Ritch) 和肯·汤普逊 (KenThompson) 为了移植和开发 UNIX 操作系统,以 B 语言为基础,在贝尔实验室设计、开发出来的。

因为 C 语言所产生的代码运行速度非常接近于汇编语言编写的代码的运行速度,所以 C 语言最初用于系统开发工作,尤其是组成操作系统的程序。Windows、macOS、Linux、Unix 等操作系统的很多底层都或多或少都使用了 C 语言编写。

C 语言对后来众多程序设计语言,如:C++、Objective-C、Java、C# 等都有一些影响,并且像 FORTRAN、Perl、Python、Pascal、LISP、Logo、BASIC 等语言的编译器或解释器都是由 C 语言编写的。

标准

K&R C

1978 年,丹尼斯·里奇布莱恩·柯林汉 合作出版了《C程序设计语言》的第一版。书中介绍的 C 语言标准也被 C 语言程序员称作「K&R C」,第二版的书中也包含了一些 ANSI C 的标准

K&R C 主要引入了以下语言特性:

  • 标准 I/O
  • srtuct 类型
  • long int 类型
  • unsigned int 类型
  • 将运算符 =+=- 改为 +=-= (前者会使编译器处理上产生混淆)

ANSI C(C89)

1989 年,为避免各开发厂商使用不同 C 语言语法而产生的差异,美国国家标准学会 ( American National Standards Institute,简称 ANSI)制订了一套完整的 C 语言国际标准语法——ANSI C,编号为 ANSI X3.159-1989,所以这个版本也被称为 C89

在标准化的同时,拓展了 K&R C 并且增加了一些新特性:

  • void 函数
  • 函数返回 struct/union 类型
  • void 数据类型

ISO C(C90)

1990年,国际标准化组织(ISO) 在 ANSI C 标准上进行少量修改,最终制定了 ISO 9899:1990 规范的 C 语言国际标准,这个版本也被称为 C90

在之前 C 语言国际化标准上做的改进有:

  • 增加了真正的标注库
  • 新的预处理命令和特性
  • 函数圆弧形允许在函数中指定参数类型
  • 新的关键字:constvolatilesigned
  • 宽字符、宽字符串和多字节字符

在 1994 年,又做了以下改进:

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

C99

在 ANSI 的标准确立后,C 语言的规范在一段时间内没有大的变动,然而 C++ 在自己的标准化创建过程中继续发展壮大。《标准修正案一》在 1994 年为 C 语言创建了一个新标准,但是只修正了一些 C89 标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了 1999 年 ISO 9899:1999 的发表,它通常被称为 C99,C99 被 ANSI 于 2000 年 3 月采用

C11

2011 年 12 月 8 日,ISO 正式发布了新的 C 语言的新标准 C11,之前被称为 C1X,官方名称为 ISO/IEC 9899:2011

新的标准提高了对 C++ 的兼容性,并增加了一些新的特性。这些新特性包括泛型、多线程、带边界检查的函数、匿名结构等

C18

对 C11 进行了补充和修正

C2x

引入了一些新特性,将有望成为下一个 C 语言的 ISO 标准,在其最新标准草案 C2x 标准上将加入符合 IEEE 标准的十进制浮点数,这使得计算机能够精确地储存浮点数

结构

组成

一个 C 程序主要组成部分为:

  • 预处理指令
  • 函数
  • 变量
  • 语句/表达式
  • 注释

以 C 语言的第一个程序「Hello World!」为例("//" 后面的内容在此处用于注释,后面会使用标准的 C 语言注释)

// 预处理指令
#include<stdio.h>
int main()                         // int main()是主函数,程序从这开始执行
{       
    printf("Hello, World!\n");     // printf()函数,打印输出"Hello,Wolrd!"
    return 0;                      // 终止main()函数,并返回0
}
/* 第一个C程序:"Hello World!" */      // 由"/*...*/"包裹起来的这部分是注释内容

第一个 C 程序输出为:

Hello World

步骤

把编写 C 语言的过程分为以下步骤:

C Step

这是理想状态下的步骤,但在实际使用过程中,尤其是在较大型的项目中,可能要做一些重复的工作或者根据下一个步骤的情况来调整或改进上一个步骤.

C 语言是一种编译型语言,源码本身无法直接执行,必须通过编译器编译后生成二进制的可执行文件,才能执行。编译器将代码从文本翻译成二进制指令的过程,就称为编译阶段,又称为「编译时」(compile time),跟运行阶段(又称为「运行时」)相区分。

C 语言的源码文件,后缀名为 .c,它实际上是一个纯文本文件,可以使用任何文本编辑器直接编辑里面的源代码内容,在 Linux 和 macOS 下可以通过软件包管理器安装 GCC 编译器、GDB 调试器,Windows 下可以安装 Cygwin 或者 MingW 等包含 C 语言所需的工具链来配置 C 语言编程环境,也可以直接在终端环境中编译、运行 C 程序。

对于一个最简单的 C 程序,保存在 hello-world.c

#include <stdio.h>
int main() {
  printf("Hello World\n");
  return 0;
}

使用 gcc 编译器对源代码进行编译和运行

# 使用 gcc 编译
gcc hello-world.c
# 未指定输出文件名的情况下为 a.out 文件(assembler output)
# 执行该文件
./a.out
Hello World # 输出结果

可以指定编译输出文件的名称,比如

gcc hello-world hello-world.c
# 执行该文件
./hello-world
Hello World # 输出结果

在使用 gcc 编译的命令的时候还可以指定编译使用的 C 标准,比如使用 C11 标准

gcc -std=c11 hello-world.c

参考资料