C语言 语法概述
1前导
-
掌握C语言基本语法
-
基本课程设计思想+语言工具的特性
-
程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计
-
C语言工具的特性:比如操作底层,尤其是内存地址的寻址及操作,指针的使用。
-
掌握C语言的设计思路,比普通的语法重要得多。
-
万变不离其宗,掌握C语言的核心规律。
-
应该多思考的一个问题:
什么时候用?
怎么用?
为什么这样设计?
优先级技巧
利用()
规划优先级,便于使用。
GCC的使用
重点:掌握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
3 C语言常见编译错误举例
预处理错误
include出错
#include"name" //从用户文件目录中去寻找,找不到再去编译系统中去寻找。
#include<name> //直接从系统变量中去寻找
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
硬件芯片操作的最小系统
bit 1 0
软件操作的最小单位,8bit == 1B
硬件处理的最小单位
char buff[xx];
数据类型之int,long,short.
int:系统一个周期,所能接受的最大处理单位。int
有时 int 32bit
int 64bit
int 16bit
整型常量
整型常量的溢出问题。
int a = 300; //单片机系统中的整形常量,溢出的情况。
int a = 65535;
long a = 300l;
long a = 300L;
特殊长度限制符
long
short
有符号数,无符号数
unsigned 数据
signed 数字
浮点数
float
double
浮点数常量
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
- static
- const
- extern
- volatile
auto · register
对内存资源存放位置的限定
资源属性中位置的限定。
默认情况下,默认分配的内存可读可写的区域。
auto int a;
auto long b;
如果在{ }
中定义,则是在栈空间中。
auto int a;
register int a;
限制变量定义在寄存器上的修饰符。
内存(存储器),
寄存器【访问寄存器的效率比访问内存效率高】
定义一些快速访问的变量,编译器会尽量的安排CPU的寄存器去存放这个A;如果寄存器不足时,a还是放在存储器(内存)中,
&
(取地址)对register
不起作用.
内存(存储器) 寄存器
0x100 R0,R1
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以内的数。
得到一个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位系统取反)
- 内存访问符号
- ()
- [] 数组,内存访问的ID号,
- {} 函数体的限制符
- -> . 地址访问,
- & * 取地址,指向地址。
逻辑操作
- 循序执行
- 分支执行
- 循环执行# C语言 语法概述
1前导
-
掌握C语言基本语法
-
基本课程设计思想+语言工具的特性
-
程序设计思想:数据类型,运算符,条件分支,循环设计,面向对象设计
-
C语言工具的特性:比如操作底层,尤其是内存地址的寻址及操作,指针的使用。
-
掌握C语言的设计思路,比普通的语法重要得多。
-
万变不离其宗,掌握C语言的核心规律。
-
应该多思考的一个问题:
什么时候用?
怎么用?
为什么这样设计?
优先级技巧
利用()
规划优先级,便于使用。
GCC的使用
重点:掌握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
3 C语言常见编译错误举例
预处理错误
include出错
#include"name" //从用户文件目录中去寻找,找不到再去编译系统中去寻找。
#include<name> //直接从系统变量中去寻找
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
硬件芯片操作的最小系统
bit 1 0
软件操作的最小单位,8bit == 1B
硬件处理的最小单位
char buff[xx];
数据类型之int,long,short.
int:系统一个周期,所能接受的最大处理单位。int
有时 int 32bit
int 64bit
int 16bit
整型常量
整型常量的溢出问题。
int a = 300; //单片机系统中的整形常量,溢出的情况。
int a = 65535;
long a = 300l;
long a = 300L;
特殊长度限制符
long
short
有符号数,无符号数
unsigned 数据
signed 数字
浮点数
float
double
浮点数常量
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
- static
- const
- extern
- volatile
auto · register
对内存资源存放位置的限定
资源属性中位置的限定。
默认情况下,默认分配的内存可读可写的区域。
auto int a;
auto long b;
如果在{ }
中定义,则是在栈空间中。
auto int a;
register int a;
限制变量定义在寄存器上的修饰符。
内存(存储器),
寄存器【访问寄存器的效率比访问内存效率高】
定义一些快速访问的变量,编译器会尽量的安排CPU的寄存器去存放这个A;如果寄存器不足时,a还是放在存储器(内存)中,
&
(取地址)对register
不起作用.
内存(存储器) 寄存器
0x100 R0,R1
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以内的数。
得到一个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位系统取反)
- 内存访问符号
- ()
- [] 数组,内存访问的ID号,
- {} 函数体的限制符
- -> . 地址访问,
- & * 取地址,指向地址。
逻辑操作
- 循序执行
- 分支执行
- 循环执行