标签:标识 保留 switch 举例 when GNU C 交换 概述 组织
程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计
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
aron1@ubuntu:~/Desktop/more$ ls
1.c 2.c inc
aron1@ubuntu:~/Desktop/more$ gcc -c -I./inc -o 1.o 1.c
aron1@ubuntu:~/Desktop/more$ gcc -c -I./inc -o 2.o 2.c
aron1@ubuntu:~/Desktop/more$ ls
1.c 1.o 2.c 2.o inc
aron1@ubuntu:~/Desktop/more$ gcc -o build 1.o 2.o
aron1@ubuntu:~/Desktop/more$ ls
1.c 1.o 2.c 2.o build inc
aron1@ubuntu:~/Desktop/more$ ./build
5
aron1@ubuntu:~/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
aron1@ubuntu:~/Desktop/more$ ls
1.c 2.c inc
aron1@ubuntu:~/Desktop/more$ gcc -c -I./inc -o 1.o 1.c
aron1@ubuntu:~/Desktop/more$ gcc -c -I./inc -o 2.o 2.c
aron1@ubuntu:~/Desktop/more$ ls
1.c 1.o 2.c 2.o inc
aron1@ubuntu:~/Desktop/more$ gcc -o build 1.o 2.o
aron1@ubuntu:~/Desktop/more$ ls
1.c 1.o 2.c 2.o build inc
aron1@ubuntu:~/Desktop/more$ ./build
5
aron1@ubuntu:~/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位系统取反)
标签:标识 保留 switch 举例 when GNU C 交换 概述 组织
原文地址:https://www.cnblogs.com/zhouhaocheng---yijianqinxin/p/12725473.html