思维导图
一、第一个C语言程序
在Linux中,C语言源程序的拓展名.c,所以C程序的源文件名字应该是xxx.c
hello.c
【1】格式
#include <stdio.h>
int main(int argc,const char *argv[])
{
printf("hello world\n");
return 0;
}
# 预处理标识符
include 是包含头文件的固定格式
<stdio.h> 是C语言标准库提供的头文件,下面的printf就包含在这个头文件里
<> 从C语言提供的标准库中找头文件
"" 从指定路径中找头文件,从当前路径中找头文件
int main 函数的返回值
main 函数名,每一个C语言程序有且仅有一个main函数,main是程序的入口,也叫主函数
() 函数的形参列表,int argc,const char *argv[] 主函数的外部参数
{} 函数体
printf 标准输出函数
("\n") printf括号内的双引号内的内容除了占位符和转义字符外都原样输出
; C语言中语句结束的标志
return 返回函数的返回值
0 main函数的返回值
【2】注释
// 单行注释
/*
多行注释
*/
#if 0
条件注释
#endif
二、gcc编译器
c语言是编译型语言,需要编译才能执行,安全的。
【1】一步编译
gcc 文件名.c | 默认生成一个名为a.out的可执行文件 执行可执行文件 ./a.out |
gcc 文件名.c -o | 可执行文件 |
gcc hello.c -o hello | 编译hello.c文件生成名为hello的可执行文件,直接./hello,可以运行可执行文件 |
【2】分步编译 E S c --> i s o
预处理----编译----汇编---链接
每一步都可以使用.c文件直接执行
i)预处理 E i
展开头文件,替换宏定义,删除注释,不会检查语法错误,生成编译文件。
gcc -E hello.c -o hello.i
ii)编译 S s
会检查语法错误,生成一个汇编文件
gcc -S hello.i -o hello.s
iii)汇编 c o
生成一个二进制文件
gcc -c hello.s -o hello.o
iv)链接
链接到程序需要的静态库/动态库,生成一个可执行文件,ELF类型的文件
gcc hello.o -o hello
三、计算机中的数据储存
数值型、非数值型
【1】计算机中的存储单位
1bit 是最小的存储单位
1Byte = 8bit 是内存分配的最小单位
1Kb = 1024Byte
1Mb = 1024Kb
1Gb = 1024Mb
1Tb = 1024Gb
【2】进制转换
二进制、十进制、八进制、十六进制······
计算机中数据的处理都是以二进制进行处理的
基数 | 2 | 8 | 10 | 16 |
数码 | 0 1 | 0-7 | 0-9 | 0-9 A-F |
位权从右到左 | 2^0 2^1 | 8^0 8^1 | 10^0 10^1 | 16^0 16^1 |
前导符 | 0b | 0 | 无 | 0x |
i)十进制转二进制
- 十进制转任意进制,直接更换辗转相除法的除数。
- 使用2的次幂形式
例如:0111 1100,从后往前,0x2^0(后续以此类推)+0+4+8+16+32+64+0=124
ii)二进制转16进制
二进制转十六进制,每四位二进制数转一位十六进制数,四位二进制数依次是8421
例如:1111 0110 =F6
15=F 6
iii)二进制转八进制
三位二进制数转一位八进制数 依次是421
一位八进制数转三位二进制数
四、基本数据类型
C语言中的数据类型分为:基本数据类型 构造数据类型 void(空类型)
【1】整形
1,2,3,4······
整形默认是int类型
数据类型 | 大小 | 占位符 |
int | 4Byte | %d |
short int | 2Byte | %d |
long int | 64位操作系统占8Byte 32位操作系统占4Byte | %ld |
long long int | 8Byte | %ld |
【2】浮点型
3.14····
浮点型数据默认是double类型
浮点型数据在计算机存储的是一个近似值。
浮点型数据的存储遵循IEEE754标准。
float最多可以表示小数点后6位
double最多可以表示小数点后15位
数据类型 | 大小 | 占位符 |
float 单精度浮点型 | 4Byte | %f |
double 双精度浮点型 | 8Byte | %lf |
【3】字符型
'a','b','c'·····
非数值型数据
在计算机中以ASCII进行存储
数据类型 | 大小 | 占位符 |
char | 1Byte | %c输出字符 %d输出字符的ASCII码 |
sizeof(数据) 运算符:求数据的大小
需要记住的ASCII码
'\n':10
'a':97
'A':65
' ':32
'0':48
五、常量
在程序运行过程中,不能修改的量。
【1】整形常量
1,2,3,4····· %d
【2】浮点型常量
1.0,2.0,7.8·····
【3】字符型常量
'a','b'···· 被单引号包起来的单个字符
【4】字符串常量
"hello","a",····· %s 被双引号包起来的一个或多个字符
C语言中字符串结束标志,字符串的结尾有一个'\0'
【5】宏定义常量
在宏定义阶段,多使用预处理查看替换结果
无参宏定义
#define 宏名 宏体
在程序中所有遇到宏名的位置都被替换成宏体
#define N 10
在程序中所有遇到N的位置都被替换成10
宏定义是宏体简单替换宏名的过程
带参宏定义
#define 带参宏名(参数) 宏体
#define ADD(a,b) a+b
#include <stdio.h>
#define S hello //hello不能作为字符串输出,因为没有""
#define STR "hello" //hello可以作为字符串输出,因为有""
#define STR1(n) #n //#把带参宏的参数转成字符串
int main(int argc, const char *argv[])
{
printf("%s\n",STR);
printf("%s\n",STR1(h));
return 0;
}
在宏定义中使用#,将带参宏的参数转换成字符串
#define STR1(n) #n //#把带参宏的参数转成字符串
练习
10/4 = 2 取整数部分
1、有如下宏定义
#define N 10
#define M N+2
#define NUM M*N+M/4
求NUM的结果
2、有如下宏定义
#define M 10
#define N M+7
#define NUM M+N*N/M+7
3、使用带参宏实现,两数相加和两数相减
宏定义的注意事项
#include <stdio.h>
#define ADD(a,b) a+b //带参宏实现两数想加
#define P(a,b) 100 //带参宏但是宏体不是和参数相关的操作
#define SUB(a,b) a-b //带参宏实现两数相减
#define S hello //hello不能作为字符串输出,因为没有""
#define STR "hello" //hello可以作为字符串输出,因为有""
#define STR1(n) #n //#把带参宏的参数转成字符串
int main(int argc, const char *argv[])
{
//带参宏仍然是宏名替换宏体的过程
printf("%d\n",ADD(2,3));
printf("%d\n",SUB(3,4));
printf("%s\n",STR);
printf("%s\n",STR1(h));
return 0;
}
六、标准输入输出函数
函数原型
int printf(const char *format, ...);
printf 使用时,需要一个格式符和一个格式符对应类型的数据
printf("占位符/格式符",输出表象); //有一个格式符就要有一个输出表象
printf("%d\n",10); //10就是输出表象,%d就是10对应的格式符
printf("%c",'c'); //字符c时输出表象,%c是字符c对应的格式符
转义字符,就是有特殊意义的字符
\n: 换行
\t: 制表符 一个tab键的大小4个空格
\b: 退格
\r: 回车 回退到行首进行输出
\\: 输出一个\,键盘上回车上面的\反斜杠,不是除号
格式符
%d: 整形数据的格式符
%-nd: 以n个数据宽度左对齐输出,不够就补空格
%nd: 以n个数据宽度右对齐输出,不够就补空格
%ld: 长整型数据的格式符
%f: 浮点型的格式符,printf默认输出小数点后6位
%.mf: 指定小数点后的输出位数
%lf: 双精度浮点型的格式符
%c: 字符型的格式符
%s: 字符串的格式符
%#x: 输出十六进制,并且带前导符0x,小写x,输出十六进制时对应的字母都是小写的
%#X: 输出十六进制,并且带前导符0X,大写x,输出十六进制时对应的字母都是大写的
%%: 输出一个%
作业:
1.整理思维导图,不需要大家整理详细的笔记,整理思维导图也是在理自己的思路。
2.写第一个C语言程序,并分步编译
3.整理宏定义的注意事项
#define ADD(a,b) a+b //带参宏实现两数相加
#define P(a,b) 100 //带参宏但是宏体不是和参数相关的操作
#define SUB(a,b) a-b //带参宏实现两数相减
#define S hello //hello不能作为字符串输出,因为没有""
#define STR "hello" //hello可以作为字符串输出,因为有""
#define STR1(n) #n //#把带参宏的参数转成字符串
宏定义的练习题重新做一遍
预习变量和scanf相关内容
进制转换
0111 1100转十进制 =124
93转二进制 =0101 1101
153转十六进制 =99
1010 0001转八进制 =241
1011 1000转十六进制 =B8