C语言简介:
BCPL -> newB -> C-> UNIX -> Minix -> Linux->gcc
C语言诞生于1971~1973年,在肯·汤普逊和丹尼斯·里奇领导下编写完成,归属于美国的贝尔实验室。
C语言为了专门编写操作系统而诞生的语言,所以天生适合对硬件编程,也因为速度快而著称,也非常适合实现数据结构和算法。
由于出现时间早,有很多缺陷,也没想到普通人能使用C语言编程,因此存在着缺陷,但是前辈总结了一些可以避免的经验《C陷阱和缺陷》《C程序设计语言》
自由源于自律
C89语法标准,也是gcc默认的语法标准
C99语法标准,对C语言的扩展和增强 -std=gnu99
C11语法标准,全新的升级
一、第一个C程序
#include <stdio.h>
int main()
{
printf("Hello,World\n");
return 0;
}
程序员所编写的代码不是标准C代码,需要一个程序翻译它,编程标准的C代码,负责翻译的程序叫做预处理器,翻译的过程叫做预处理,被翻译的代码叫做预处理指令,以#开头的都叫做预处理指令
#include 的功能是把一个头文件导入到当前文件中
#include <xxx.h> 从系统指定的路径下加载头文件
#include “xxx.h” 先从当前工作路径下加载头文件,如果没有则再从系统指定的路径下加载头文件
stdio.h 头文件:以.h结尾,里面储存一些辅助性代码,绝大多数都是函数的声明(也就是函数的开头)
源文件:以.c结尾,里面记录的是功能性代码
C语言标准委员会为C语言以函数形式提供了一套基础的功能,这些函数就被封装在libc.so库中
很多头文件负责对libc.so进行说明,stdio.h就是其中一个,常用string.h stdlib.h
stradard input output 负责对输入输出功能函数的说明
main函数:
C语言中以函数为单位来管理代码,一个函数就是一段具有某个功能的代码的集合
main函数是程序的执行入口(目前有且只能有一个)
int 是一种数据类型,它表示main函数的执行结果是一个整数
return 有两个功能:1、返回一个数给函数的调用者(main是给操作系统)2、结束函数执行
main函数的调用者是操作系统,它的返回值给了操作系统,反映了程序是如何结束的,通常有三种:
正数 出现异常(别人的错误)
0 一切正常
负数 出现错误(自己的错误)
echo $? 可以查看上一个main函数的返回值
printf/scanf 是标准库中的函数,负责输入、输出数据,用来调试程序
转义字符:键盘上有一些没有的符号,用一些特殊的字符来表示,这些特殊的字符就叫转义字符
\n 换行到行首
\t 制表符Tab
\r 回到行首
\b 退格键
\a 铃响
\ \
%% %
C语言以 ; 作为一行代码的结束,用 {} 来划分区域
二、C代码变成可执行程序的过程
1、预处理:把源文件翻译成预处理文件
gcc -E code.c 显示预处理结果到终端
gcc -E code.c -o code.i 生成以 .i 结尾的预处理文件
2、编译:把预处理文件编译成汇编文件
gcc -S code.i 生成以 .s 结尾的汇编文件
3、汇编:把汇编文件翻译成二进制的目标文件
gcc -c code.s 生成以 .o 结尾的目标文件
4、链接:把若干个目标文件合并成一个可执行程序
gcc code.o 生成默认名是a.out的可执行程序
C语言中文件类型:
.h 头文件
.h.gch 头文件的编译结果,它会被优先使用
.c 源文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库
.os 共享库
三、编译器
负责把人能看懂的记录代码的文本文件翻译成计算机能看懂的二进制文件,有预处理器、编译器、连接器组成。
gcc 是GNU社区为了编译Linux代码而开发的一款免费的编译器,采用默认的C89标准,-std=gnu99来设置C99标准
常用的参数:
-E 显示预处理结果
-S 生成汇编代码
-c 只编译不链接
-o 设置编译结果的名字
-I 指定头文件的加载路径
-l 指定要使用的库 -lm,使用数据库
-Wall 以严格的标准来检查代码,用来显示更多的警告
-Werror 把警告当错误处理
-std 指定编译的语法标准
储存空间的单位:
Bit 比特 一个二进制位,只能存储0或1,计算机存储数据的最小单位
byte 字节 八个二进制位,计算机存储器的存储容量的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB
四、数据类型
为什么要对数据进行分类:
1、现实社会中的数据自带类别属性
2、对数据进行分类可以节约存储空间、提高运行效率
C语言中的数据分为两大类:自建(程序员自己设计的类型,例如:结构、联合、枚举、类)、内建(C语言自带)
整型:
signed 有符号
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 -2147483648~2147483647(正负20亿)
signed long 4/8(32位是4/64位是8) 正负20亿/9开头的19位数
signed long long 8
注意:signed 不加就代表加了
unsigned 无符号(无符号数与有符号数进行运算,有符号数转换成无符号数)
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~40亿
unsigned long 4/8(32位是4/64位是8)
unsigned long long 8 1开头的20位数
注意:由于定义无符号数据比较麻烦,标准库把这些无符号的类型重新定义成以下类型:
需要包含头文件 <stdint.h>
uint8_t uint16_t uint32_t uint64_t
int8_t int16_t int32_t int64_t
浮点型:
float 4
double 8
long double 12/16(32位是12/64位是16)
注意:采用科学计数法,二进制与真实的数据之间需要翻译,因此计算浮点型要比整型慢,能尽量使用整型
小数点后6位有效
模拟:
char:字符 其实是图案或者是符号,在内存中储存的是整数,需要显示时,根据ASCII码表,找到该整数对应的符号或图案,然后显示
0 == ‘\0’ 48 == ‘0’ 65 == ‘A’ 97 == ‘a’
bool(布尔):先有了C才有了bool类型,所以C语言是不可能有真正的布尔类型,stdbool.h头文件对布尔类型进行了模拟
bool true false
可以使用sizeof来计算类型的字节数
五、常量与变量
什么是变量:程序运行期间数值可以变化的叫做变量,相当于储存数据的盒子
定义:类型变量名;
int num;
取名规则:
1、由字母、数字、下划线组成
2、不能以数字作为开头
3、不能与32个关键字(能够默写)重名
4、见名知意(功能、类型、作用范围)
示例:unsigned char num_u_c
注意:变量定义时,一定要初始化&#x