KilluaZoldyck 2020-04-18
程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计
C语言工具的特性:比如操作底层,尤其是内存地址的寻址及操作,指针的使用。
掌握C语言的设计思路,比普通的语法重要得多。
万变不离其宗,掌握C语言的核心规律。
应该多思考的一个问题: 什么时候用? 怎么用? 为什么这样设计?
利用()
规划优先级,便于使用。
重点:掌握C语言如何变成机器指令的过程
GCC工具的几个常用选项和意义
难点:gcc
编译过程中在gcc
工具上的体现
实验:编写gcc
,利用gcc
工具集验证每一步的执行效果
gcc -I //查找头文件的目录 gcc -L gcc -E //预处理 gcc -S //汇编 gcc -c //链接 gcc -D //条件预处理
GNU Compilier Collection
通过gcc -v
查看是否安装了gcc编译器
gcc -o
output 输出文件名 输入文件名
gcc是根据不同文件的后缀名,去调用gcc中不同编译组织功能。
实验需要的命令
gcc -o [输出文件名] [输入文件名] ./[运行文件名] // ./表示在在当前目录 gcc -v -o
//汇编 as -o a.0 a.s
//链接 collect2
#include"name" //从用户文件目录中去寻找,找不到再去编译系统中去寻找。 #include<name> //直接从系统变量中去寻找
gcc -I[查找头文件目录]
? 语法错误(低级错误)
gcc -o build 001.c abc.c //简单方法 gcc -c -I./inc -o a.o 001.c //推荐方法 gcc -c -I./inc -o b.o abc.c gcc -o build a.0 b.o
:~/Desktop/more$ ls 1.c 2.c inc :~/Desktop/more$ gcc -c -I./inc -o 1.o 1.c :~/Desktop/more$ gcc -c -I./inc -o 2.o 2.c :~/Desktop/more$ ls 1.c 1.o 2.c 2.o inc :~/Desktop/more$ gcc -o build 1.o 2.o :~/Desktop/more$ ls 1.c 1.o 2.c 2.o build inc :~/Desktop/more$ ./build 5 :~/Desktop/more$ tree . ├── 1.c ├── 1.o ├── 2.c ├── 2.o ├── build └── inc └── fun.h
__FUNCTION__
表示所处的函数
__LINE__
表示所处的行号
__FILE__
表示所处的那个文件
gcc -DABC -o build 001.c
#
##
# 字符串化 ## 连接符号 #define ABC(x) #x #define ABC(x) day##x
重点: 掌握c语言的常用关键及其应用场景,使用技巧。 掌握位运算符的典型操作 难点: when to do? how to do? why to do? 熟悉常用运算符的典型操作,总结什么时候使用什么运算符。
? 资源属性【大小】
? 限制内存【空间】大小,关键字。
int a; sizeof(a); //得到的值和编译器和系统有关系
硬件芯片操作的最小系统
bit 1 0
软件操作的最小单位,8bit == 1B
char buff[xx];
有时 int 32bit
? int 64bit
? int 16bit
整型常量的溢出问题。
int a = 300; //单片机系统中的整形常量,溢出的情况。 int a = 65535; long a = 300l; long a = 300L;
float
double
double
一种占位标志/声明标志,之后还需要强制转换才能使用。
struct //结构体。数据之间的和 struct myabc{ int a; int b; }; union //共用体。共用起始地址,存放数据。【技巧型代码】 enum //枚举:被命名的整型常数的集合 enum{MOD = 1,TUE,WED}; //enum 枚举名称 {常量列表}; //在内核程序中的使用使用作功能的集合。 typedef //数据类型的别名 int a = 700; int b = 3600; len_t a = 700; time_t b = 3600; [xxx_t :被typedef处理过]
if(){ } else{ }
switch (‘整形变量‘){ #### case : break; default; }
循环
continue(中断本次循环),继续运行下去 break (中断所有循环),继续运行下去 goto (在函数内跳转)
对内存资源存放位置的限定
资源属性中位置的限定。
默认情况下,默认分配的内存可读可写的区域。
auto int a;
auto long b;
如果在{ }
中定义,则是在栈空间中。
auto int a;
register int a;
限制变量定义在寄存器上的修饰符。
内存(存储器),
寄存器【访问寄存器的效率比访问内存效率高】
定义一些快速访问的变量,编译器会尽量的安排CPU的寄存器去存放这个A;如果寄存器不足时,a还是放在存储器(内存)中,
&
(取地址)对register
不起作用.
内存(存储器) 寄存器
0x100 R0,R1
静态声明
修饰三种数据:
外部声明
常量的定义:不能改的变量;只读的变量(可以通过指针可以修改)。
const int a = 100;
内存泄漏
告知编译器编译方法的关键字,不优化编译。
修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件外部的用户)
- auto - register - static - const - extern - volatile
算术操作运算符 + -
* / %
int a = b*10; //CPU可能多个周期,甚至要利用软件的模拟方法去实现乘法。 int a = b+10; //CPU一个周期可以处理。
0%3=0 1%3=1 2%3=2 3%3=0 3%4=1 ...... n%m= res[0,m-1] //取一个范围内的数 (m%100)+1 ===> res;//取一个100以内的数。
得到一个M进制的数
循环数据结构的的小标
逻辑运算
真假的选择
||
&&
A||B 与 B||A //是不一样的 int a = 10; int res; res = ((a==10)||printf("========\n")); printf("%d\n",res); res = ((a!=10)||printf("========\n")); printf("%d\n",res);
>
>=
<
<=
!
对比位运算中的取反符号。
int a = 0x0000l if(!a){ }//逻辑取反 ~a==0xffff //逐位取反
? :
等于if else
位运算
<<
>>
左移:相当于乘以2
右移:相当于除以2
数据,数字(涉及到符号)
//-1 * 2 = -2 //8bits 10000001 11111110 //符号位不变,其余为取反。 11111111 == -1 //+1(计算机中存储的数据) //---------------------------------------------- 10000010 11111101 //符号位不变,其余为取反。 11111110 == -2 //+1(计算机中存储的数据)
右移:与符号变量有关。
int a = -1; //符号位为1,或者因为不确定性。符号位为1;所以右移的数字位为1. while(a){ a = a>>1; } printf("----\n");//因为符号位的存在,永远都不能执行到这一行。
&
|
^
&:屏蔽
int a = 0x1234 a = a & 0xff00;//屏蔽第八位。
&:取出
A&1 = A;
&:清零器
|
:或操作
A|0 = A; //保留 A|1 = 1; //设置为高电平的办法。 int a; a |= (0x1<<5);//设置为一个资源的bit5为高电平,其他位不变。 a |= (0x1<<n); int a; //清除第五位 a = a&(~(0x01<<5));
^
(异或),~
通过异或交换两个数
1 ^ 1 = 0; 0^0=0; 1 ^ 0 = 0; a = a^b; b = a^b; a = a^b;
~
0xf0 ~ 0xffff ff0f //(32位系统取反)
程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计
C语言工具的特性:比如操作底层,尤其是内存地址的寻址及操作,指针的使用。
掌握C语言的设计思路,比普通的语法重要得多。
万变不离其宗,掌握C语言的核心规律。
应该多思考的一个问题: 什么时候用? 怎么用? 为什么这样设计?
利用()
规划优先级,便于使用。
重点:掌握C语言如何变成机器指令的过程
GCC工具的几个常用选项和意义
难点:gcc
编译过程中在gcc
工具上的体现
实验:编写gcc
,利用gcc
工具集验证每一步的执行效果
gcc -I //查找头文件的目录 gcc -L gcc -E //预处理 gcc -S //汇编 gcc -c //链接 gcc -D //条件预处理
GNU Compilier Collection
通过gcc -v
查看是否安装了gcc编译器
gcc -o
output 输出文件名 输入文件名
gcc是根据不同文件的后缀名,去调用gcc中不同编译组织功能。
实验需要的命令
gcc -o [输出文件名] [输入文件名] ./[运行文件名] // ./表示在在当前目录 gcc -v -o
//汇编 as -o a.0 a.s
//链接 collect2
#include"name" //从用户文件目录中去寻找,找不到再去编译系统中去寻找。 #include<name> //直接从系统变量中去寻找
gcc -I[查找头文件目录]
? 语法错误(低级错误)
gcc -o build 001.c abc.c //简单方法 gcc -c -I./inc -o a.o 001.c //推荐方法 gcc -c -I./inc -o b.o abc.c gcc -o build a.0 b.o
:~/Desktop/more$ ls 1.c 2.c inc :~/Desktop/more$ gcc -c -I./inc -o 1.o 1.c :~/Desktop/more$ gcc -c -I./inc -o 2.o 2.c :~/Desktop/more$ ls 1.c 1.o 2.c 2.o inc :~/Desktop/more$ gcc -o build 1.o 2.o :~/Desktop/more$ ls 1.c 1.o 2.c 2.o build inc :~/Desktop/more$ ./build 5 :~/Desktop/more$ tree . ├── 1.c ├── 1.o ├── 2.c ├── 2.o ├── build └── inc └── fun.h
__FUNCTION__
表示所处的函数
__LINE__
表示所处的行号
__FILE__
表示所处的那个文件
gcc -DABC -o build 001.c
#
##
# 字符串化 ## 连接符号 #define ABC(x) #x #define ABC(x) day##x
重点: 掌握c语言的常用关键及其应用场景,使用技巧。 掌握位运算符的典型操作 难点: when to do? how to do? why to do? 熟悉常用运算符的典型操作,总结什么时候使用什么运算符。
? 资源属性【大小】
? 限制内存【空间】大小,关键字。
int a; sizeof(a); //得到的值和编译器和系统有关系
硬件芯片操作的最小系统
bit 1 0
软件操作的最小单位,8bit == 1B
char buff[xx];
有时 int 32bit
? int 64bit
? int 16bit
整型常量的溢出问题。
int a = 300; //单片机系统中的整形常量,溢出的情况。 int a = 65535; long a = 300l; long a = 300L;
float
double
double
一种占位标志/声明标志,之后还需要强制转换才能使用。
struct //结构体。数据之间的和 struct myabc{ int a; int b; }; union //共用体。共用起始地址,存放数据。【技巧型代码】 enum //枚举:被命名的整型常数的集合 enum{MOD = 1,TUE,WED}; //enum 枚举名称 {常量列表}; //在内核程序中的使用使用作功能的集合。 typedef //数据类型的别名 int a = 700; int b = 3600; len_t a = 700; time_t b = 3600; [xxx_t :被typedef处理过]
if(){ } else{ }
switch (‘整形变量‘){ #### case : break; default; }
循环
continue(中断本次循环),继续运行下去 break (中断所有循环),继续运行下去 goto (在函数内跳转)
对内存资源存放位置的限定
资源属性中位置的限定。
默认情况下,默认分配的内存可读可写的区域。
auto int a;
auto long b;
如果在{ }
中定义,则是在栈空间中。
auto int a;
register int a;
限制变量定义在寄存器上的修饰符。
内存(存储器),
寄存器【访问寄存器的效率比访问内存效率高】
定义一些快速访问的变量,编译器会尽量的安排CPU的寄存器去存放这个A;如果寄存器不足时,a还是放在存储器(内存)中,
&
(取地址)对register
不起作用.
内存(存储器) 寄存器
0x100 R0,R1
静态声明
修饰三种数据:
外部声明
常量的定义:不能改的变量;只读的变量(可以通过指针可以修改)。
const int a = 100;
内存泄漏
告知编译器编译方法的关键字,不优化编译。
修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件外部的用户)
- auto - register - static - const - extern - volatile
算术操作运算符 + -
* / %
int a = b*10; //CPU可能多个周期,甚至要利用软件的模拟方法去实现乘法。 int a = b+10; //CPU一个周期可以处理。
0%3=0 1%3=1 2%3=2 3%3=0 3%4=1 ...... n%m= res[0,m-1] //取一个范围内的数 (m%100)+1 ===> res;//取一个100以内的数。
得到一个M进制的数
循环数据结构的的小标
逻辑运算
真假的选择
||
&&
A||B 与 B||A //是不一样的 int a = 10; int res; res = ((a==10)||printf("========\n")); printf("%d\n",res); res = ((a!=10)||printf("========\n")); printf("%d\n",res);
>
>=
<
<=
!
对比位运算中的取反符号。
int a = 0x0000l if(!a){ }//逻辑取反 ~a==0xffff //逐位取反
? :
等于if else
位运算
<<
>>
左移:相当于乘以2
右移:相当于除以2
数据,数字(涉及到符号)
//-1 * 2 = -2 //8bits 10000001 11111110 //符号位不变,其余为取反。 11111111 == -1 //+1(计算机中存储的数据) //---------------------------------------------- 10000010 11111101 //符号位不变,其余为取反。 11111110 == -2 //+1(计算机中存储的数据)
右移:与符号变量有关。
int a = -1; //符号位为1,或者因为不确定性。符号位为1;所以右移的数字位为1. while(a){ a = a>>1; } printf("----\n");//因为符号位的存在,永远都不能执行到这一行。
&
|
^
&:屏蔽
int a = 0x1234 a = a & 0xff00;//屏蔽第八位。
&:取出
A&1 = A;
&:清零器
|
:或操作
A|0 = A; //保留 A|1 = 1; //设置为高电平的办法。 int a; a |= (0x1<<5);//设置为一个资源的bit5为高电平,其他位不变。 a |= (0x1<<n); int a; //清除第五位 a = a&(~(0x01<<5));
^
(异或),~
通过异或交换两个数
1 ^ 1 = 0; 0^0=0; 1 ^ 0 = 0; a = a^b; b = a^b; a = a^b;
~
0xf0 ~ 0xffff ff0f //(32位系统取反)