1. C 语言简介

1.1 什么是 C 语言

  • C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。

  • 在 1978 年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)制作了 C 的第一个公开可用的描述,现在被称为 K&R 标准。

  • UNIX 操作系统,C编译器,和几乎所有的 UNIX 应用程序都是用 C 语言编写的。由于各种原因,C 语言现在已经成为一种广泛使用的专业语言。

  • 特点:

    • 易于学习。
    • 结构化语言。
    • 它产生高效率的程序。
    • 它可以处理底层的活动。
    • 它可以在多种计算机平台上编译。

1.2 为什么要学习C语言

  • C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。下面列举几个使用 C 的实例:
    • 操作系统
    • 语言编译器
    • 汇编器
    • 文本编辑器
    • 打印机
    • 网络驱动器
    • 现代程序
    • 数据库
    • 语言解释器
    • 实体工具

2. C 程序结构

2.1 第一个 C 语言程序:HelloWorld

#include <stdio.h>

int main()
{
    //第一个 C 语言程序
    printf("Hello World!\n");
    return 0;
}

2.2 代码分析

2.2.1 include 头文件包含

  •  #include 的意思是头文件包含,#include <stdio.h> 代表包含 stdio.h 这个头文件,告诉 C 编译器在实际编译之前要包含 stdio.h 文件

  • 使用 C 语言库函数需要提前包含库函数对应的头文件,如这里使用了 printf() 函数,需要包含 stdio.h 头文件

  • #include <>#include ""的区别:

    • <> 表示系统直接按系统指定的目录检索
    • "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

2.2.2 main 函数

  • 一个完整的 C 语言程序,是由一个且只能有一个 main() 函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
  • main 函数是 C 语言程序的入口,程序是从 main 函数开始执行

2.2.3 {} 括号,程序体和代码块

  • {} 叫代码块,一个代码块内部可以有一条或者多条语句
  • C 语言每句可执行代码都是 ; 分号结尾
  • 所有的 # 开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
  • 所有的可执行语句必须是在代码块里面

2.2.4 注释

  • // 叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
  • /* */ 叫块注释:块注释是 C 语言标准的注释方法
  • 行注释是从 C++ 语言借鉴过来的

2.2.5 printf 函数

  • printf 是 C 语言库函数,功能是向标准输出设备输出一个字符串
  • printf(“hello world\n”); \n的意思是回车换行

2.2.6 return 语句

  • return 代表函数执行完毕,返回 return 代表函数的终止
  • 如果 main 定义的时候前面是 int,那么 return 后面就需要写一个整数
  • 如果 main 定义的时候前面是 void,那么 return 后面什么也不需要写
  • 在 main 函数中 return 0 代表程序执行成功,return -1 代表程序执行失败
  • int main()void main() 在 C 语言中是一样的,但 C++ 只接受 int main 这种定义方式

3. C 语言编译过程

3.1 gcc 编译器介绍

  • 编辑器(如vi、记事本)是指我用它来写程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我们用编辑器编写程序,由编译器编译后才可以运行

  • 编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。

  • gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc 原本作为 GNU 操作系统的官方编译器,现已被大多数类 Unix 操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,gcc 同样适用于微软的 Windows。

  • gcc 最初用于编译 C 语言,随着项目的发展 gcc 已经成为了能够编译 C、C++、Java、Ada、fortran、Object C、Object C++、Go 语言的编译器大家族。

  • 编译命令格式:

    • gcc [-option1] ... <filename>
    • g++ [-option1] ... <filename>
    • 命令、选项和源文件之间使用空格分隔
    • 一行命令中可以有零个、一个或多个选项
    • 文件名可以包含文件的绝对路径,也可以使用相对路径
    • 如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名,Linux 平台为 a.out,Windows 平台为 a.exe
  • gcc、g++ 编译常用选项说明

    • -o file 指定生成的输出文件名为file
    • -E 只进行预处理
    • -S 只进行预处理和编译
    • -c 只进行预处理、编译和汇编

3.2 C 程序编译步骤

  • C代码编译成可执行程序经过4步:
    1. 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
    2. 编译:检查语法,将预处理后文件编译生成汇编文件
    3. 汇编:将汇编文件生成目标文件(二进制文件)
    4. 链接:C 语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

image.png

3.3 gcc 编译过程

3.3.1 分步编译

  • 预处理:gcc -E hello.c -o hello.i

    • 带 # 的语句就是预处理指令,预处理指令在预处理的时候处理了
    • 头文件展开: #include <stdio.h> 包含文件 stdio.h(预处理时将 stdio.h 文件拷贝至预处理文件中)
    • 删除注释
    • 宏替换:#define 代表是声明一个宏, 在预处理时会将宏给替代
    • 预处理时 不会检查语法错误
    • 条件编译: 条件不成立:#if 0 -> #endif  条件成立 #if 1 -> #endif
  • 编译:gcc -S hello.i -o hello.s 将预处理文件编译生成汇编文件,检查语法错误

  • 汇编:gcc -c hello.s -o hello.o 将汇编文件编译生成二进制文件.o

  • 链接:gcc hello.o -o hello 设置运行环境,堆栈等,链接其他库

  • 文件后缀

    • .c C 语言文件
    • .i 预处理后的 C 语言文件
    • .s 编译后的汇编文件
    • .o 编译后的目标文件

image.png

3.3.2 一步编译

  • gcc hello.c -o hello 还是经过:预处理、编译、汇编、链接的过程

image.png

4. system 函数

  • 功能:在已经运行的程序中执行另外一个外部程序
  • 参数:外部可执行程序名字
  • 返回值:
    • 成功:0
    • 失败:任意数字
#include <stdio.h>
#include <stdlib.h>

int main()
{
    //win 平台启动计算器
    system("calc");
    //使用路径启动程序
    system("D:/Develop/VisualStudioProjects/CLanguageOverview/CLanguageOverview/hello.exe");

    return 0;
}
此作者没有提供个人介绍。
最后更新于 2025-05-03