一、GCC编译器的使用
一步到位:gcc xxx.c -o xxx
四步走:预处理=>编译=>汇编=>链接
1.预处理:预处理指令解析,头文件展开,宏定义替换,注释删除
gcc -E xx.c -o xxx.i
2.编译: 语法,词法分析,生成汇编程序
gcc -S xxx.i -o xxx.s
3.汇编: 将汇编程序编译生成目标程序(.o),是一个二进制程序
gcc -c xxx.s -o xxx.o
4.链接: 将多个目标程序与相关库(静态库或动态库)进行链接,生成可执行程序
gcc xxx.o -o xxx(可执行程序)
二、c语言框架介绍
#include<stdio.h>
//预处理指令:以#开头的都是预处理指令
//inlcude:表示这是一个文件包含指令,在预处理阶段会讲括起来的文件给展开
//<>:表示这是一个系统库里面的头文件:/usr/include
//"":也可以使用双引号括起来一个文件,表示包含指定路径中的某个文件
//stdio:standard buffered input/output,标准缓冲输入输出
//h:表示这是一个头文件,C或C++的头文件,都是以.h结尾
//主程序:主函数,一个程序有且只能有一个名为main的函数
//是整个程序的入口函数,整个程序随着main函数的开始而开始
//随着main函数的终止而结束
int main(int argc, const char *argv[])
//main函数,可以有返回值也可以没有返回值,可以有参数也可以没有参数
//void main(); void main(int argc, const char *argv[])
//int表示该函数的返回值为整形,也可以是void,无返回值类型,C99标准之后
//一般都为有返回值函数
//括号中表示外部向该函数传递的参数,也可以没有,设置为空的小括号
{
//argc为外部传递的参数的个数
printf("argc = %d\n", argc); //执行参数个数,包含可执行程序自己
//argv:是一个指针数组,每个元素都是一个字符串
//访问其中元素可以使用argc[数字]:argc[0]表示第一个参数
//argv[1]表示第二个外部参数,以此类推
printf("argv[0] = %s\n", argv[0]);
printf("argv[1] = %s\n", argv[1]);
return 0;
//有返回值函数的函数,需要使用return语句将相关数据返回
}
//花括号表示作用域,在C语言中,使用花括号来划分功能模块
三、运算符
运算符的种类:单、算、关、逻、条、赋、逗
表达式:由操作数和运算符组成,并且能返回一个确定值的式子,叫做表达式
操作数:参与运算的数据,可以是常量、可以是变量、也可以是一个表达式
(例如:1+2*3)
运算符:参与运算,能够表示相关运算的数学符号叫做运算符
左值(lvalue)和右值(rvalue)的概念
1、左值和右值的概念是相对于赋值运算符而言的
2、既能够放在等号(赋值运算符)左侧也能放在等号右侧的值称为左值。左值的本质是有地址空间的。例如变量、堆区申请的空间、地址返回的函数返回值
3、只能放在等号右侧的值称为右值。右值的本质是没有地址空间。例如常量、临时值、表达式的结果、值返回的函数返回值
4、在C语言中,所有表达式的结果全部都是一个右值
四、printf
#include <stdio.h>
int printf(const char *format, ...);
功能:向标准输出(stdout)缓冲区中写入一个格式串
关于格式控制符的介绍:
%# :表示输出数据时带的先导符,常用于于八进制和十六进制数据
%0:表示空白位用0补齐
%hh:表示要输出一字节整数(数值类型)----> hhd(有符号数据) hhu(无符号数据)
%h:表示输出两字节整数 ---->hd(有符号) hu(无符号)
%l:表示输出8字节整型 ---->ld(有符号long类型) lu(无符号long类型)
%ll:表示输出long long类型的数据、 ----> lld(有符号long long类型) llu(无符号long long 类型)
%d、%i:输出整数数据
%o:输出8进制数据
%u:输出无符号数据
%x: 输出16进制数据
%e、%E:针对于double类型的数据,以科学计数法的方式打印数据
%f:表示输出小数
%c:输出一字节字符数据
%s:输出一个字符串
%p:输出指针类型的数据(地址,以十六进制展示)
五、字符型数据
1、使用char类型表示字符型数据
2、字符型数据在内存中占 1 个字节
3、计算机识别的是数值型数据,但是字符数据不能被直接识别,为了方便起见,将每个特定的字符通过某种方式转变成数值,然后由计算机识别
4、转变方式中,所用到的密码本,我们称为ASCII码
常用字符以及特殊字符 '\0' : 0 '0' :48 '9' :57 'a'-'z' :97--122 'A'-'Z' :65--90 注意:相同的字符,小写字符的值比大写字符的值大, 相差32 '\a' :7 警报 '\b' :8 回退 '\t' :9 制表符 '\n' :10 换行 '\r' :13 回车 '\0ddd' :表示一个八进制数据 '\xddd':表示一个十六进制数据
六、整型数据
短整型:short int 占内存空间大小:2个字节 取值范围: 无符号:0 --- 65535 有符号:-2^15(-32768) --- +2^15-1(32767) 输入输出对应的格式控制符 无符号:%hu 有符号:%hd
整型:int 1、所占内存:4字节32位 2、取值范围: 无符号:0 ---- 2^32-1(42亿+) 有符号:-2^31 ---- +2^31-1 足以支撑生活中的所有整数,所以,C语言中所有整数默认是int类型 3、输入输出格式 无符号:%u 有符号:%d %i
长整型:long int 1、所占内存:8字节64位 2、取值范围: 无符号:0 ---- 2^64-1 有符号:-2^63 --- 2^63-1 3、输入输出格式: 无符号:%lu 有符号:%ld
七、实型数据
双精度实型:double 1、所占字节:8字节 2、精准度:小数点后14--16位左右 所有的小数默认是double类型 3、输入输出格式:%lf
单精度实型:float 1、所占字节:4字节 2、精准度:小数点后7位左右 3、输入输出格式:%f
八、类型转换
自动类型提升、强制类型转换
自动类型提升:
在运算中,如果参与运算的数据有高字节和低字节类型的数据进行运算时,会将低字节的数据,先自动转换为高字节数据,然后进行运算
但是,通过自动类型提升后的结果是一个临时值,原值的类型依然保持不变、
注意:该自动类型提升,只对4字节及以上的数据类型有效
低于4字节的数据进行运算时,都会将其自动类型提升为4字节数据,然后进行相关运算
例如:2 + 3.5 1、原则上是不能直接运算的,因为2是int类型,而3.5是double类型 2、运算时,会将2自动类型提升为double类型,之后跟3.5进行运算 3、其实运算的本质是,2自动类型提升为double类型的数据的临时值 与3.5进行运算 :X + 3.5 4、在类型提升后,只是临时值的类型是double,但是 2 还是int类型
强制类型转换:
(转换的类型)表达式;
将表达式结果的类型,强制转换为括号中的数据类型
例如: int num = 2; double key = 3.5; int value = (int)(num + key); //将表达式的结果,强制类型转换为int类型 常用于: int *ptr = (int *)malloc(4); //将函数调用的结果,强制转换为 int * 类型