# C 概述
- 通用、面向过程式
- 1972 年诞生于贝尔实验室
- 作者是丹尼斯里奇
- 当前 C 标准是 C18(2023 年 1 月 5 日)
- UNIX 操作系统,C 编译器,和几乎所有的 UNIX 应用程序都是用 C 语言编写的
- C 语言是为了编写 UNIX 操作系统而被发明的
- C 语言是以 B 语言为基础的,B 语言大概是在 1970 年被引进的
- C 语言标准是于 1988 年由美国国家标准协会(ANSI,全称 American National Standard Institute)制定的
- UNIX 操作系统完全使用 C 语言编写
- C 语言是最广泛使用的系统程序设计语言
- Linux 操作系统、MySQL 都是使用 C 语言编写的
- C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样
- C11(也被称为 C1X)指 ISO 标准 ISO/IEC 9899:2011。在它之前的 C 语言标准为 C99
- C 程序的源文件通常使用扩展名 .c
# 开发环境
我们使用 vscode 开发
- 下载 windows 环境 c 编译器 MinGW。Sourceforge, 百度云 (karj)
- 将
mingw64\bin
加入系统变量并 cmd 输入gcc -v
测试 - 下载 vscode。下载地址
- vscode 安装
C/C++
扩展,确认是 Microsoft 家的。 - vscode 安装
Code Runner
扩展(logo 是.run)。 - 配置
Code Runner
扩展,File
-Preference
-Settings
,将Run Code Configuration
中的Run In Terminal
、Save File Before Run
前面的复选框选中。 - 新建 c 程序项目目录,vscode
Open Folder
, 左侧菜单新建hello.c
文件,写入内容#include <stdio.h>
int main(){
printf("Hello World!");
return 0;
}
- 代码编辑完成后还不能直接运行。还需要配置俩 json 文件。
- 在
Terminal
菜单下点击Configure Tasks...
子菜单,选择C/C++:gcc.exe生成活动文件
,随后自动创建一个tasks.json
的文件。不用做任何改动。 - 最后,回到
hello.c
文件,单击鼠标右键选择Run Code
即可运行代码。运行结果会在下面出现的Terminal
中显示 - 如果想要调试代码的话呢?点击
Run
菜单下的Start Debugging
子菜单。在随后出现的弹出框中选择C++(GDB/LLDB)
,再选择”gcc.exe“。 - vscode 终端中文乱码临时解决方案:
chcp 65001
(UTF-8 代码页编号为 65001)
# 代码片段
/* | |
1. 头文件是扩展名为.h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。 | |
2. 有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 | |
3. 在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。 | |
4.printf () 函数在 "stdio.h" 头文件中声明。 | |
5.stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 | |
6. 当编译器遇到 printf () 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。 | |
7.stdio 表示系统文件库,也可以声明其它的 | |
8.<.h > 表示头文件,因为这些文件都是放在程序各文件的开头 | |
9.#include 告诉预处理器将指定头文件的内容插入到预处理器命令的相应位 导入头文件的预编译指令 | |
10.<> 表示系统自带的库,也可以写成 ""表示用户自定义的库,如果写成" " 并且自定义的库里面没有这个文件系统会自动查找自带的库,如果还是没有报错 | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
/* | |
1. 所有的 C 语言程序都需要包含 main () 函数。 | |
2. 代码从 main () 函数开始执行。程序的入口. | |
3. 一个程序有且只能有一个 main 函数的存在 | |
*/ | |
int main1(){ | |
//printf () 用于格式化输出到屏幕。 | |
printf("Hello World! I\'m VSCode\n"); | |
//return 0; 语句用于表示退出程序。 | |
return 0; | |
} | |
int main2(int argc, char *argv[]){ | |
printf("控制台执行:gcc .\\hello.c 生成hello.exe文件\n"); | |
printf("控制台执行:.\\hello.exe Hello,World Jalen \n"); | |
// 第一个参数存放的是可执行程序的文件名字,然后依次存放传入的参数(从第二个开始) | |
// 下面输出:输出可执行程序 D:\c-practise\hello.exe ,参数个数为 [3],运行输出第二个参数:[Hello,World] | |
printf("输出可执行程序 %s ,参数个数为[%d],运行输出第二个参数:[%s]\n", argv[0], argc, argv[1]); | |
// 下面输出:空格分隔第三个参数 Jalen | |
printf("空格分隔第三个参数 %s \n", argv[2]); | |
return 0; | |
} | |
int main3(){ | |
int a, b, sum; | |
printf("input two int nums\n"); | |
scanf("%d,%d", &a, &b); | |
sum = a + b; | |
printf("%d+%d=%d\n", a, b, sum); | |
return 0; | |
} | |
/* | |
1.void main 是以前的写法,不推荐 | |
*/ | |
void main4(){ | |
printf("Hello World!"); | |
} | |
/* | |
1. 编译和执行 c 程序 | |
(1)命令行执行:gcc .\hello.c 默认生成 a.exe(linux 是 a.out) | |
(2)如要指定生成的可执行文件名,可加 - o 参数,如:gcc .\hello.c -o jalen.exe | |
(3)下面代码将 gcc 换成 g++ 编译效果几乎等同 | |
(4)如果是多个 c 代码的源码文件,编译方法如下:$ gcc test1.c test2.c -o main.out | |
2.gcc 和 g++ 区别 | |
(1)gcc 和 g++ 都是 GNU (组织) 的一个编译器。 | |
(2)后缀为.c 的,gcc 把它当作是 C 程序,而 g++ 当作是 c++ 程序; | |
(3)后缀为.cpp 的,两者都会认为是 c++ 程序 | |
(4)注意:虽然 c++ 是 c 的超集,但是两者对语法的要求是有区别的 | |
(5)g++ 还会默认告诉链接器,让它链接上 C++ 标准库;gcc 默认不会链接上 C++ 标准库 | |
*/ | |
int main5(){ | |
printf("Hello"); | |
// 生成的 .exe 文件打开时会一闪而过,为了避免这个问题可在 return 0; 前加入 system ("pause"); 语句 | |
system("pause"); | |
return 0; | |
} | |
/* | |
1.GDB(GNU Debugger)调试 | |
(1)GDB 可以调试 ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal 等语言 | |
(2)对于 C 程序来说,需要在编译时加上 - g 参数,保留调试信息,否则不能使用 GDB 进行调试。 | |
(3)如果不是自己编译的程序,并不知道是否带有 - g 参数,可以查看段信息:$ readelf -S helloWorld|grep debug | |
(4)编译下面代码:"gcc -g -o jalen .\hello.c" | |
(5)输入 “gdb .\jalen.exe” 进入调试 | |
(6)在 gdb 交互窗口直接输入 “run xxx” 调试看输出,或者先 “set args xxx” 再执行 “run” | |
(7)输入 “q” 退出 gdb 交互 | |
(8)更多内容查看:https://zhuanlan.zhihu.com/p/74897601 | |
*/ | |
int main6(int argc, char *argv[]){ | |
if (1 >= argc){ | |
printf("usage:hello name\n"); | |
return 0; | |
} | |
printf("Hello World %s!\n", argv[1]); | |
return 0; | |
} |