C语言高级 语法概述

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

小练习

:~/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

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

静态声明

修饰三种数据:

  1. 函数内部变量
  2. 函数外部变量
  3. 函数的修饰符

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

小练习

:~/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

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

静态声明

修饰三种数据:

  1. 函数内部变量
  2. 函数外部变量
  3. 函数的修饰符

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号,
    • {} 函数体的限制符
    • -> . 地址访问,
    • & * 取地址,指向地址。

逻辑操作

  • 循序执行
  • 分支执行
  • 循环执行

相关推荐