C语言高级 语法概述
2021-02-13 22:19
标签:标识 保留 switch 举例 when GNU C 交换 概述 组织 程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计 C语言工具的特性:比如操作底层,尤其是内存地址的寻址及操作,指针的使用。 掌握C语言的设计思路,比普通的语法重要得多。 万变不离其宗,掌握C语言的核心规律。 利用 重点:掌握C语言如何变成机器指令的过程 GCC工具的几个常用选项和意义 难点: 实验:编写 GNU Compilier Collection 通过 gcc是根据不同文件的后缀名,去调用gcc中不同编译组织功能。 实验需要的命令 ? 语法错误(低级错误) ? 资源属性【大小】 ? 限制内存【空间】大小,关键字。 硬件芯片操作的最小系统 bit 1 0 软件操作的最小单位,8bit == 1B 有时 int 32bit ? int 64bit ? int 16bit 整型常量的溢出问题。 double 一种占位标志/声明标志,之后还需要强制转换才能使用。 循环 对内存资源存放位置的限定 资源属性中位置的限定。 默认情况下,默认分配的内存可读可写的区域。 如果在 内存(存储器), 寄存器【访问寄存器的效率比访问内存效率高】 定义一些快速访问的变量,编译器会尽量的安排CPU的寄存器去存放这个A;如果寄存器不足时,a还是放在存储器(内存)中, 内存(存储器) 寄存器 0x100 R0,R1 静态声明 修饰三种数据: 外部声明 常量的定义:不能改的变量;只读的变量(可以通过指针可以修改)。 内存泄漏 告知编译器编译方法的关键字,不优化编译。 修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件外部的用户) 算术操作运算符 得到一个M进制的数 循环数据结构的的小标 逻辑运算 对比位运算中的取反符号。 等于if else 位运算 左移:相当于乘以2 右移:相当于除以2 数据,数字(涉及到符号) 右移:与符号变量有关。 &:屏蔽 &:取出 &:清零器 通过异或交换两个数 程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计 C语言工具的特性:比如操作底层,尤其是内存地址的寻址及操作,指针的使用。 掌握C语言的设计思路,比普通的语法重要得多。 万变不离其宗,掌握C语言的核心规律。 利用 重点:掌握C语言如何变成机器指令的过程 GCC工具的几个常用选项和意义 难点: 实验:编写 GNU Compilier Collection 通过 gcc是根据不同文件的后缀名,去调用gcc中不同编译组织功能。 实验需要的命令 ? 语法错误(低级错误) ? 资源属性【大小】 ? 限制内存【空间】大小,关键字。 硬件芯片操作的最小系统 bit 1 0 软件操作的最小单位,8bit == 1B 有时 int 32bit ? int 64bit ? int 16bit 整型常量的溢出问题。 double 一种占位标志/声明标志,之后还需要强制转换才能使用。 循环 对内存资源存放位置的限定 资源属性中位置的限定。 默认情况下,默认分配的内存可读可写的区域。 如果在 内存(存储器), 寄存器【访问寄存器的效率比访问内存效率高】 定义一些快速访问的变量,编译器会尽量的安排CPU的寄存器去存放这个A;如果寄存器不足时,a还是放在存储器(内存)中, 内存(存储器) 寄存器 0x100 R0,R1 静态声明 修饰三种数据: 外部声明 常量的定义:不能改的变量;只读的变量(可以通过指针可以修改)。 内存泄漏 告知编译器编译方法的关键字,不优化编译。 修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件外部的用户) 算术操作运算符 得到一个M进制的数 循环数据结构的的小标 逻辑运算 对比位运算中的取反符号。 等于if else 位运算 左移:相当于乘以2 右移:相当于除以2 数据,数字(涉及到符号) 右移:与符号变量有关。 &:屏蔽 &:取出 &:清零器 通过异或交换两个数 C语言高级 语法概述 标签:标识 保留 switch 举例 when GNU C 交换 概述 组织 原文地址:https://www.cnblogs.com/zhouhaocheng---yijianqinxin/p/12725473.htmlC语言 语法概述
1前导
掌握C语言基本语法
基本课程设计思想+语言工具的特性
应该多思考的一个问题:
什么时候用?
怎么用?
为什么这样设计?
优先级技巧
()
规划优先级,便于使用。GCC的使用
gcc
编译过程中在gcc
工具上的体现
gcc
,利用gcc
工具集验证每一步的执行效果gcc -I //查找头文件的目录
gcc -L
gcc -E //预处理
gcc -S //汇编
gcc -c //链接
gcc -D //条件预处理
gcc -v
查看是否安装了gcc编译器gcc -o
output 输出文件名 输入文件名
gcc -o [输出文件名] [输入文件名]
./[运行文件名] // ./表示在在当前目录
gcc -v -o
//汇编
as -o a.0 a.s
//链接
collect2
3 C语言常见编译错误举例
预处理错误
include出错
#include"name" //从用户文件目录中去寻找,找不到再去编译系统中去寻找。
#include
gcc -I[查找头文件目录]
编译错误
链接错误
原材料不够
原材料多了
编译多个c文件
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
5预处理介绍
include 包含头文件
define 宏 替换,不进行语法检查
define 宏名 宏体【加括号】【宏名用大写字母作为标识符】
define ABC(x) 5+(x) //宏函数
预定义宏
__FUNCTION__
表示所处的函数__LINE__
表示所处的行号__FILE__
表示所处的那个文件6预处理的使用
条件预处理举例
gcc -DABC -o build 001.c
7宏展开下的
#
##
# 字符串化
## 连接符号
#define ABC(x) #x
#define ABC(x) day##x
C语言常用关键字及运算符课程介绍
重点:
掌握c语言的常用关键及其应用场景,使用技巧。
掌握位运算符的典型操作
难点:
when to do? how to do? why to do?
熟悉常用运算符的典型操作,总结什么时候使用什么运算符。
32个关键字
关键字-数据类型
int a;
sizeof(a); //得到的值和编译器和系统有关系
char
硬件处理的最小单位
char buff[xx];
数据类型之int,long,short.
int:系统一个周期,所能接受的最大处理单位。int
整型常量
int a = 300; //单片机系统中的整形常量,溢出的情况。
int a = 65535;
long a = 300l;
long a = 300L;
特殊长度限制符
long
short
有符号数,无符号数
unsigned 数据
signed 数字
浮点数
float
double
浮点数常量
void
自定义数据类型
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;
}
do while (条件)
for(次数)
continue(中断本次循环),继续运行下去
break (中断所有循环),继续运行下去
goto (在函数内跳转)
类型修饰符
auto · register
auto int a;
auto long b;
{ }
中定义,则是在栈空间中。auto int a;
register int a;
限制变量定义在寄存器上的修饰符。&
(取地址)对register
不起作用.
static
extern
const
const int a = 100;
volatile
- 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以内的数。
真假的选择
||
&&
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 //逐位取反
? :
>>
//-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
^
(异或),~
1 ^ 1 = 0; 0^0=0;
1 ^ 0 = 0;
a = a^b;
b = a^b;
a = a^b;
~
0xf0 ~ 0xffff ff0f //(32位系统取反)
逻辑操作
1前导
掌握C语言基本语法
基本课程设计思想+语言工具的特性
应该多思考的一个问题:
什么时候用?
怎么用?
为什么这样设计?
优先级技巧
()
规划优先级,便于使用。GCC的使用
gcc
编译过程中在gcc
工具上的体现
gcc
,利用gcc
工具集验证每一步的执行效果gcc -I //查找头文件的目录
gcc -L
gcc -E //预处理
gcc -S //汇编
gcc -c //链接
gcc -D //条件预处理
gcc -v
查看是否安装了gcc编译器gcc -o
output 输出文件名 输入文件名
gcc -o [输出文件名] [输入文件名]
./[运行文件名] // ./表示在在当前目录
gcc -v -o
//汇编
as -o a.0 a.s
//链接
collect2
3 C语言常见编译错误举例
预处理错误
include出错
#include"name" //从用户文件目录中去寻找,找不到再去编译系统中去寻找。
#include
gcc -I[查找头文件目录]
编译错误
链接错误
原材料不够
原材料多了
编译多个c文件
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
5预处理介绍
include 包含头文件
define 宏 替换,不进行语法检查
define 宏名 宏体【加括号】【宏名用大写字母作为标识符】
define ABC(x) 5+(x) //宏函数
预定义宏
__FUNCTION__
表示所处的函数__LINE__
表示所处的行号__FILE__
表示所处的那个文件6预处理的使用
条件预处理举例
gcc -DABC -o build 001.c
7宏展开下的
#
##
# 字符串化
## 连接符号
#define ABC(x) #x
#define ABC(x) day##x
C语言常用关键字及运算符课程介绍
重点:
掌握c语言的常用关键及其应用场景,使用技巧。
掌握位运算符的典型操作
难点:
when to do? how to do? why to do?
熟悉常用运算符的典型操作,总结什么时候使用什么运算符。
32个关键字
关键字-数据类型
int a;
sizeof(a); //得到的值和编译器和系统有关系
char
硬件处理的最小单位
char buff[xx];
数据类型之int,long,short.
int:系统一个周期,所能接受的最大处理单位。int
整型常量
int a = 300; //单片机系统中的整形常量,溢出的情况。
int a = 65535;
long a = 300l;
long a = 300L;
特殊长度限制符
long
short
有符号数,无符号数
unsigned 数据
signed 数字
浮点数
float
double
浮点数常量
void
自定义数据类型
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;
}
do while (条件)
for(次数)
continue(中断本次循环),继续运行下去
break (中断所有循环),继续运行下去
goto (在函数内跳转)
类型修饰符
auto · register
auto int a;
auto long b;
{ }
中定义,则是在栈空间中。auto int a;
register int a;
限制变量定义在寄存器上的修饰符。&
(取地址)对register
不起作用.
static
extern
const
const int a = 100;
volatile
- 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以内的数。
真假的选择
||
&&
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 //逐位取反
? :
>>
//-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
^
(异或),~
1 ^ 1 = 0; 0^0=0;
1 ^ 0 = 0;
a = a^b;
b = a^b;
a = a^b;
~
0xf0 ~ 0xffff ff0f //(32位系统取反)
逻辑操作