三、编译器
负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成、
gcc 是由GNU社区为了编译Linux内核代码而开发的一款免费的编译器
gcc常用的编译参数:
-E 只显示预处理的结果到终端
-std=gnu99 设置c99语法标准
-c 只编译不链接
-o 指定编译结果的名字 -> -oname / -o name
-S 生成汇编代码
-I 指定头文件的加载路径 -I 加载路径
-wall 尽可能多地产生警告
-werror 把警告当错误处理
-l 指定要加载的代码库文件 -lm 使用数学库
四、c代码变成可执行文件的详细过程:
1、预处理 把源文件翻译成预处理文件
gcc -E name.c 只显示预处理的结果到终端
gcc -E name.c -o name.i 生成以.i结尾的预处理文件
2、编译 把预处理的文件翻译成汇编文件
gcc -S name.i 生成以.s结尾的汇编文件
3、汇编 把汇编文件翻译成二进制的目标文件
gcc -c name.s 生成以.o结尾的目标文件
4、链接 把若干个目标文件合并成一个可执行文件
gcc a.0 b.o c.o ... 默认生成a.out可执行文件
五、c语言的文件类型:
.c 源文件
.h 头文件
.h.gch 头文件的编译结果文件,它会被优先使用
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件
六、存储空间的单位
bit 比特 一个二进制位,只能存储0或者1,计算机中存储数据的最小单位
byte 字节 八个二级制位,计算机存储器描述存储容量的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB
七、数据类型
为什么要对数据进行分类?
1、现实生活中的数据本身就自带类别属性
2、对数据进行分类可以节约存储空间、提高了运行速度
c语言中数据分类为两大类:自建(程序员自己设计的类型:结构、联合、类)和内建(c语言自带的类型)
注意:运算符 sizeof 可以计算类型、变量的字节数
整型:
signed 有符号(0正数1负数) 多少字节 范围
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 正负20亿
signed long 4/8
signed long long 8 正负9开头的19位整数
unsigned 无符号
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~40亿左右
unsigned long 4/8
unsigned long long 8 0~1开头的20位整数
注意: signed不加就代表了加
由于定义无符号整型时比较麻烦:c标准库把这些类型重定义成一些新的简单的类型名:
需要导入头文件
无符号: uint8_t uint16_t uint32_t uint64_t
有符号: int8_t int16_t int32_t int64_t
浮点型: 有小数部分的类型
float 单精度 4
double 双精度 8
long double 12/16
注意:小数点后六位有效
注意:采用一定的算法对真实的浮点型数据到二进制数据进行转换,
这个过程比存储、读取整型要慢得多,编程时尽量使用整数数据
double num
if(num < 0.000001 && num >-0.000001)
模拟型:
字符型: char
字符就是符号或图案,在内存中存储得依然是整数,需要显示出字符时,
会根据ASCII表中对应得关系显示出对应得字符或图案
' ' 0 特殊字符
'0' 48
'A' 65
'a' 97
布尔型: bool
现有得c语言后有的bool类型,所以c语言中不可能有真正得布尔类型,
在头文件 stdbool.h 中对布尔类型进行了模拟
bool true false
非0值为真,0值为假
八、变量和常量
什么时变量:程序运行期间数值可以发送变化得叫做变量,相当于一个存储数据的盒子
定义: 类型名 变量名;
int num;
取名规则:
1、由字母、数字、下划线组成
2、不能以数字开头
3、不能与c语言的32个关键字重名,能默写
4、见名知意(功能类型作用范围...)
int sum_s_i
使用:
赋值: 变量名 = 10;
num = 10;
参与运算: 2+(变量名*10);
2+(num*10);
注意: c语言中变量的初始值是随机的,为了安全起见,一般在定义时初始化为0
变量的输出与输入:
int printf(const char *foramt, ...)
功能:输出数据
foramt:"双引号包含的提示信息+占位符"
...:变量名列表
返回值:输出字符个数
类型占位符: c语言中通过类型占位符传递变量的类型
signed %hhd %hd %d %ld %lld
unsigned %hhu %hu %u %lu %llu
float %f
double %lf
long double %LF
字符型 char %c
练习1: 定义各种类型的变量并初始化,使用printf显示它们各自的值
int scanf(const char *foramt, ...);
功能: 输入数据
foramt:"双引号包含的占位符"
...: 变量地址列表
返回值:成功输入的变量的个数
注意: scanf需要提供变量的地址
&变量名 == 变量地址
什么是常量:程序运行期间数值不能改变的叫做常量
100 默认int类型
100l long
100ll long long
100u unsigned int
100lu unsigned long
100llu unsigned long long
3.14 默认double类型
3.14f float
3.14l long double
九、格式化输入输出
%nd 显示n个字符宽度,不够则补充空格,右对齐
%-nd 显示n个字符宽度,不够则补充空格,左对齐
%0nd 显示n个字符宽度,不够则补充0,右对齐
%n.mf 显示n个字符宽度(小数点也算一位),不够则补充空格,m表示小数点后几位(四舍五入,不够补0),右对齐
%g 不显示小数点后多余的0
十、运算符
自变运算符: ++/-- 使变量的值自动+1或者-1
前自变: ++num/--num 立即生效
后自变: num++/num-- 下一个语句才生效
注意: 不要在一行代码中多次使用自变运算符
算术运算符: + - * / %
整数/整数 结果还是整数,没有小数点,只保留整数部分
10/3 -> 3
10%3 -> 1
/ % 除数不能为0, 否则就会浮点数例外(核心已转储),这是个运行报错,一旦产生程序立即停止,后面不再执行
关系运算符: > < >= <= == !=
比较结果0(不成立)或者1(成立),比较的结果可以继续参与后续的运算
int n = -100;
if(10 < n < 100)
结果永远为真,与数学运算规则不同
注意: == 建议常量放在左边
逻辑运算符: && || !
先把运算对象转换成逻辑值,0转换为假,非0转换成真
A && B 一假即假
A || B 一真即真
!A 求反
&& || 短路特性:
当左边部分的值可以确定整个表达式的结果时,右边部分就不执行计算
三目运算符: 运算对象有三个部分
A ? B : C
判断A的值如果为真则执行B的内容,否则执行C
赋值运算符
a = 10;
a += 10;
a -= 10;
a *= 10;
a /= 10;
a %= 10;
位运算符: & | ~ ^ << >>
十一、分支语句
if(表达式) //单分支
{
//表达式为真(非0),则执行此处代码
}
if(表达式) //双分支
{
//表达式为真(非0),则执行此处代码
}
else
{
//表达式为假(0),则执行此处代码
}
if(表达式1) //多分支
{
//表达式1为真(非0),则执行此处代码
}
elseif(表达式2)
{
//表达式2为真(非0),则执行此处代码
}
......
else
{
//如果以上所有表达式都为假,则最后执行此处代码
}
作业:
1、输入三个整数,从小到大显示
#includeint main(int argc,const char* argv[]) { int a,b,c,t=0; printf("请输入三个整数:n"); scanf("%d %d %d",&a,&b,&c); if(a>b) { t=a; a=b; b=t; } if(a>c) { t=a; a=c; c=t; } if(b>c) { t=b; b=c; c=t; } printf("%d %d %dn",a,b,c); }
2、输入一个年份,判断是否是闰年?
#includeint main(int argc,const char* argv[]) { int year; printf("请输入一个年份:"); scanf("%d",&year); if((0 == year%4 && 0 != year%100) || (0 == year%400)) { printf("是闰年n"); } else { printf("不是闰年n"); } return 0; }
3、输入一个年份和月份,判断该月有多少天?
#includeint main(int argc,const char* argv[]) { int year,month; printf("请输入年和月:"); scanf("%d %d",&year,&month); if(2 == month) { if((0 == year%4 && 0 != year%100) || (0 == year%400)) { printf("该月有29天n"); } else { printf("该月有28天n"); } } else if(1 == month || 3 == month || 5 == month || 7 == month || 8 == month || 10 == month || 12 == month) { printf("该月有31天n"); } else if(4 == month || 6 == month || 9 == month || 11 == month) { printf("该月有30天n"); } else { printf("输入的月份有问题n"); } return 0; }
4、输入一个成绩,判断等级
#includeint main(int argc,const char* argv[]) { int grade; printf("请输入你的成绩:"); scanf("%d", &grade); if(100 < grade || 0 > grade) { printf("你输入的成绩有误!n"); } else if(90 <= grade && 100 >= grade) { printf("An"); } else if(80 <= grade && 90 > grade) { printf("Bn"); } else if(70 <= grade && 80 > grade) { printf("Cn"); } else if(60 <= grade && 70 > grade) { printf("Dn"); } else if(0 <= grade && 60 > grade) { printf("En"); } return 0; }
十二、熟记****32个关键字****
数据类型相关:
内建类型:
char short int long void float double 7
自建类型:
struct union enum sizeof 4
类型限定符:
auto const static volatile register typedef extern signed unsigned 9
流程控制相关:
分支:
if else switch case default 5
循环:
or while do 3
跳转:
break continue goto return 4



