什么是C语言?
C语言是一门通用计算机编程语言(计算机语言),广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WINTC、SUBLIME、MSVC(VS的编译器)、Turbo C等。
C语言的优点:
- 设计特性
C是一种融合了控制特性的现代语言,其设计使得用户可以采用自顶向下的规划、结构化的编程,以及模块化的设计。这种做法使得编写出的程序更可靠、更易懂。
- 高效性
C是一种高效的语言。C程序往往很紧凑且运行速度快。C可以表现出通常只有汇编语言才有的精细控制能力。可以细调程序以获得最大速度或最大内存使用率。
强大的功能和灵活性
面向编程人员
缺点:
C的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
C在表达方面的自由会增加风险。
可移植性不强。
这个主要是针对 Java 的。Java 的可移植性太强了,所以就显得C语言的可移植性不强。什么叫可移植性?就是说 Java 程序在哪个机器上都可以运行,而且结果一模一样。而C语言就不行,C程序在其他机器上不一定能运行。而且就算能运行,结果可能也不一样。
- 开发周期长。
因为C语言是面向过程的语言,面向过程语言的一个特点就是写大项目的时候很容易“崩溃”。当代码上到 10 万行的时候很容易崩溃,会出现各种各样莫名其妙的错误。这时候就需要用另外一种思想将整个程序的框架重新设计一下,即用面向对象的思想设计。
使用C语言的7个步骤:
定义程序目标
设计程序
编写代码
编译
编译器是一个程序,其工作是将源代码转换为可执行代码。
可执行代码是用计算机的本机语言或机器语言表示的代码。这种语言是由数字代码表示的详细指令组成的。
不同计算机具有不同的机器语言,C编译器用来将C语言转换成特定的机器语言。C编译器还从C的库中向最终程序加入代码。库中包含着许多标准例程供你使用。(准确来说是一个被称为链接器的程序将库例程引入的,但在多数系统上,编译器为你运行链接器),最后形成一个包含计算机可以理解的代码并且你能够运行的可执行文件。
运行程序
测试和调试程序
维护和修改程序
文件名
hello.c——名称中小点前面部分被称为基本名,小点后的部分被称为扩展名,组合在一起就是文件名。
该名称还应该满足特定计算机操作系统的需要。例如:MS-DOS是IBM PC及其兼容机的操作系统。它要求基本名不能大于8个字符长度。一些UNIX系统对整个文件名长度,包括扩展名在内,有14个字符的限制;
其他UNIX系统允许更长的名字,最长为255个字符。Linux、windows和Macintosh OS也允许长文件名。
目标代码文件、可执行文件和库
编译器将源代码转换为机器代码,将结果放置在一个目标代码文件(目标文件)中。虽然目标文件包含机器语言代码,但该文件还不能运行。目标文件包含源代码的转换结果,但它还不是一个完整的程序。
目标文件中所缺少的第一个元素是一种叫做启动代码的东西,此代码相当于你的程序和操作系统之间的接口。例如,你可以在DOS或Linux下允许一个IBM PC兼容机,在两种情况中硬件是相同的,所以都会使用同样的目标代码,但DOS和Linux要使用不同的启动代码,因为这两种系统处理程序的方式不同。
缺少的第二个元素是库例程的代码。几乎所有C程序都利用标准C库中所包含的例程。目标文件中不包含这一函数的代码。
链接器的作用就是将这3个元素(目标文件、系统标准启动代码和库函数)结合在一起,并将它们存放在单个文件,即可执行文件。
对库代码来说,链接器只从库中提取你所使用的函数所需的代码。
在一些系统中必须分别运行编译和链接程序。在另一些系统上,编译器可以自动启动链接器,我们只需给出编译命令即可。
为什么不内置输入输出语句?
并非所有的程序员都要用I/O(输入输出)包,并且C语言的一个基本设计原则是避免不必要的成分。
在传统的C语言要求在一个代码块的开始处声明变量,在这之前不允许任何其他语句。
现在C99遵循C++的惯例,允许把声明放在代码块中的任何位置。但是,在首次使用变量之前仍然必须先声明它。
编写代码风格规范
- 缩进:凡是有代码块的地方都必须缩进,一对大括号 { } 代表一个代码块
- 空格:标点符号后面,一般加空格
- 空行:不同逻辑段落中间,一般加空行
- 符号命名:尽量能一望便知,做到顾名思义,避免使用无意义字符
C语言的基本编程规则
- 必要的头文件,作用是我们使用其它库函数的“索引”
- C程序入口 – – main主函数
- 使用数据对象(标识符)必须先声明
- C语句:分号问题;分号作为语句的结束标志,可以一行多句或多行一句(用/来分行);但为了代码的可读性,一般一行一句
- 排版问题
- 在一些你认为关键语句后面添加注释
标识符
能够使用的字符的数量与C语言的不同实现有关。C99标准允许一个标识符最多可以有63个字符。除了外部标识符,后者只识别31个标识符。
与C90分别要求的31个字符和6个字符相比较,这是相当可观的进步,而更旧的编译器通常最多只允许8个字符。
实际上,是可以超过规定的最大值,但是编译器不会识别超出的部分,如果两个标识符的字符超出了最大值,但它们最大值之前的字符一样,不管超出部分的字符是否相同,这两个标识符是相同的,编译器当作一个标识符处理。
操作系统和C库通常使用一个或两个下划线开始的名字,我们最后避免使用。
标识符命名规则
- 标识符用作给变量、函数命名。
- 以字母、下划线“_”开头,后面可跟字母、下划线“_”和数字。(java的标识符还可以是$,C语言的不清楚可不可以用)
- 应该使用有意义的名称,达到见名知意的目的。
- 尽量不要使用中文或拼音。
数据类型
- 基本数据类型
- 字符类型(char)
- 数值类型
- 整型
- 短整型(short)
- 整型(int)
- 长整型(long)
- 实型
- 单精度(float)
- 双精度(double)
- 枚举类型(enum)
- 指针类型
- 空类型(void)
- 构造类型
- 数组
- 结构体
- 共同体
数据类型也分为有符号数据类型(signed)和无符号数据类型(unsigned)。
常见的char、short、int、long都为有符号数据类型,为signed char、signed short…的简写。
浮点型都为有符号类型,不存在无符号类型,这跟浮点型在内存中的存储形式有关。
(下一个笔记中记录的数据在内存中的存储方式中有相关解释)
数据在内存中的存储
char 字符数据类型 1Byte 8Bit
有效范围为-128 ~ 127
图中最高位为符号位,0为正数,1为负数
唯一比较难理解的是为什么1000 0000为-128而不是-0,因为0000 0000为0了,不需要两个0,而且1000 0000的补码为1 1000 0000(-128),所以规定将-0用做-128.
char ch = 127; ch = ch+1;//ch等于-128而不是128
可以用下图来表示char类型的存储更有利于理解:
无符号char的范围是:0~255
剩下的数据类型
short //短整型 2Byte 16Bit -32768~32767
unsigned short 0 ~ 65,535
int //整形 一般为4Byte 32Bit -2147483648~2147483647
unsigned int 0 ~ 4294967295
long //长整形
unsigned long
long long //更长的整形
unsigned long long
float //单精度浮点数
double //双精度浮点数
对于整型来说,不同的系统中数据类型的大小可能不一样
(1)16位平台
char 1个字节8位
short 2个字节16位
int 2个字节16位
long 4个字节32位
指针 2个字节16位
(2)32位平台
char 1个字节8位
short 2个字节16位
int 4个字节32位
long 4个字节32位
long long 8个字节64位
指针 4个字节32位
(3)64位平台
char 1个字节
short 2个字节
int 4个字节
long 8个字节(区别)
long long 8个字节
指针 8个字节(区别)
1、类型的取值范围只要记住char和short的有符号和无符号的就可以了。
2、C标准规定,float类型必须至少能表示6位有效数字,取值范围至少为10^-37到10^+37。6位有效数字指浮点数至少应能精确表示像33.333 333这样的数字的前6位。double类型和float类型具有相同的最小取值范围要求,但它至少能表示10位有效数字。一般地,double使用64位而不是32位长度。
3、C语言没有字符串类型,一般用char[]或char*来存储字符串。
4、编程时,当使用int类型不能表示一个数而使用long类型可以做到时,使用long类型。但是,在long类型大于int类型的系统中(16\64位系统),使用long类型会减慢计算,所以没必要时不要使用long类型。如果在long类型等于int类型的系统中编写代码,当确实需要32位整数,应使用long类型(而不是int类型),以便使程序被移植到16位机器上仍然可以正常使用。
C90新增的数据类型关键字:
signed
void
C99新增的数据类型关键字:
_Bool //布尔值
_Complex //复数
_Imaginary //虚数
这些类型可以按其在计算机中的存储方式被划分为整数类型和浮点数类型。
本文大部分参考自“比特科技”的学习资料,感兴趣的同学可以到B站找一下,讲得非常仔细。
>>Markdown学习笔记
>>数据在内存中的存储
>>标准输入输出函数
>>printf源码