c语言基础知识归纳
C语言过程性语言,
结构化c程序的设计原则:
1.自顶而下;
2.逐步细化;
3.模块化设计;
4.结构化编码。
针对嵌入式C在实现中,存在两种不同的环境:翻译环境(translation environment)和执行环境(execution envionment)。
翻译环境:源代码转换为可执行的机器之类。
执行环境:用于实际执行代码。
两种环境很多时候位于不同的机器上。如:交叉编译器(cross compiler)部署在服务器端,
它产生的可执行代码运行于不同的CPU上。
由源程序到可执行代码需要经过翻译。
翻译阶段将组成程序的每个源文件通过编译过程转换为目标代码(object code)。然后,各个目标文件由链接器(linker)绑定在一起,形成可执行程序。链接器同时也会引入C函数库及个人或他人编写的库函数。
编译过程由预处理(prepressing),编译(compilation),汇编(assembly),链接(linker)。
预处理阶段:预处理器在源代码上执行文本操作。如:将#define指令定义的符号用实际值代替,读取由#include指令包含的文件内容,删除注释,添加行号和文件名标识,便于编译器在编译时产生调试用的行号信息和编译错误及告警的行号。
gcc -E test.c -o test.i
编译阶段:源代码经过解析,判断它的语句意思。此部分产生绝大多数的错误和告警。
分为扫描,语法分析,语义分析,源代码优化(在命令行加入了要求优化选项),目标代码生成,目标代码优化,优化器(optimizer)对目标代码优化,使它效率更高。注意优化需要额外的时间。
gcc -S test.i -o test.s 或 gcc -S test.c -o test.s
汇编:由汇编器as完成,将汇编代码转换为机器可执行的指令。
as test.s -o test.o 或 gcc -c test.c -o test.o 或 gcc -g -o test.o test.c
链接:由连接器ld完成,将源代码生成目标文件,如*.ko ,*.so ,*.out等
ld *.o -o test.out
链接生成的目标文件,为最终可执行文件。
C语言基础知识概述
C语言程序由函数组成,其中至少包含一个名为main的函数,它是程序执行的入口点。main函数可以调用其他函数,也可以被其他函数调用(但通常不这么做)。
C语言支持多种数据类型,包括整型(int)、浮点型(float, double)、字符型(char)等。此外,还有枚举(enum)、结构体(struct)、联合体(union)和指针等复杂数据类型。
- 变量:存储数据的容器,其值在程序执行期间可以改变。
- 常量:在程序执行期间其值不能改变的量。
C语言支持多种运算符,包括算术运算符(如+, -, *, /)、关系运算符(如==, !=, <, >)、逻辑运算符(如&&, ||, !)和位运算符(如&, |, ^, ~)等。
- 条件语句:if语句、if…else语句、switch语句等,用于根据条件执行不同的代码块。
- 循环语句:for循环、while循环、do…while循环等,用于重复执行一段代码直到满足特定条件。
- 数组:一系列相同数据类型的元素的集合,可以通过索引访问。
- 字符串:在C语言中,字符串是以空字符(\\0)结尾的字符数组。
指针是C语言的一个核心概念,它存储了变量的内存地址。通过指针,可以直接访问和修改内存中的数据。
函数是完成特定任务的独立代码块,可以被程序中的其他部分调用。函数可以接收参数,也可以返回结果。
C语言标准库提供了stdio.h头文件,支持基本的输入输出功能,如printf函数用于输出,scanf函数用于输入。
预处理指令以#开头,在编译之前由预处理器处理。常见的预处理指令包括#include(包含文件)、#define(定义宏)、#ifdef、#ifndef、#endif(条件编译)等。
之后重要的是:
- 内存管理:了解动态内存分配,包括malloc、calloc、realloc和free。
- 结构体(struct)和联合体(union):如何创建复杂的数据结构。
- 文件操作:如何使用C语言进行文件的读写操作。
- 位操作:位操作符,如位与(&)、位或(|)、位非(~)、位异或(^)等。
- 标准库:C语言提供了丰富的标准库函数,如字符串处理(strcpy, strcat等)、数学函数(sin, cos等)。
- 错误处理:如何处理程序中的错误和异常情况。
C语言基础
register寄存器变量
static静态变量
const只读变量
auto自动变量
extern声明变量外部可用
if 、else 、switch、 case、 default条件控制语句
continue、break、 for、 while、 goto循环控制语句
sizeof 测量类型的大小
typedef 给类型取别名
volatile 防止编译器优化
常量:所见即所得,它的值不能修改
printf(“%c\\n”, ‘a’); 输出字符
printf(“%p\\n”, ‘a’); 输出地址
printf(“%d\\n”, 10); 输出整型
printf(“%hd\\n”, 10); 输出短整型
printf(“%ld\\n”, 10L); 输出长整型
printf(“%f\\n”, 3.14f); 输出浮点型
printf(“%lf\\n”, 3.14); 输出双精度
printf(“%s\\n”, “hello world”);输出字符串
变量:系统根据变量的类型大小,为变量开辟空间
变量命名规则:以字母、数字、下划线组成,不能以数字开头,不能是关键字
//变量声明,告诉编译器声明,不能赋值
extern int data2;//变量的声明
int data2=100;//变量定义
‘a’
单引号 只能作用一个字符,转义字符除外。
单引号:
第一个作用’a’描述a为字符
第二个作用去字符的ASCLL值
printf %c输出的是字符
printf %d输出的是字符的ASCLL值
字符定义
char ch=’\\0’;
getchar();可用于去除回车或接受字符
sizeof();
显示所占字节数
sizeof(num);
定义:float f=3.14f;//浮点型加f
二进制,c语言不能直接输出二进制
八进制,%o输出八进制 不区分正负
十进制,%d %ld %hd %u %lu %hu
进制转换
十进制转其他进制用短除法
其他进制转二进制,将n进制转换成二进制
printf(“%#o\\n”, num);输出八进制
printf(“%#x\\n”, num);输出十六进制
无符号数:原码=反码=补码
有符号数:
正数:原码=反码=补码
负数:反码=原码符号位不变,其他位按位取反
补码=反码+1
统一了0的编码
将减法运算变加法运算
负数在计算机以补码的方式存储
非负数在计算机中以原码形式存储
八进制数以原码存储
十六进制以原码存储
\\和某些字符结合产生新的含义
‘\\0’ ASCII为0
‘\\n’换行符
‘\\t’缩进符
‘\\r’回到首行符
‘\\a’发出警报
八进制转义 ‘\\ddd’
\’\\ddd\’ 每个d的范围必须是0~7 3个d表示最多识别3位八进制数据
十六进制转义 ‘\\xhh’
‘\\xhh’每个h的范围0~9 a~f 2个h表示最多识别2位十六进制
(1)无符号和有符号 参加运算 需要将有符号 转换成无符号
(2)nt和double参加运算 会将int转成从double类型
(3)char和short类型 只要参加运算 都会将自己转换成int类型
(4)强制转换
(类型说明符)(表达式)
(int)p+1//对p强转int类型后+1
(int)(p+1)对p+1强转成int类型
/ 如果/的所有运算对象都是整数 /的功能就是取整
如果/有一个运算对象是实型 /的功能就是除法运算
% 取余运算符
a+=b a=a+b
a-=b a=a-b
a=b a=ab
a/=b a=a/b
a%=b a=a%b
将右边看成一个整体
a=4+5 === a=a(4+5)
逻辑与&&
逻辑或||
逻辑非!
按位与& (有0为0,全为1为1)
a=11001100
a=a & 10111111
a=10001100
按位或| (有1为1,全为0为0)
a=11001100
a=a | 10111111
a=11111111
按位取反~ (0变1,1变0)
a=11001100
a=~a
a=00110011
按位异或^ (相同为0不同唯1)
a=11001100
a=a ^ 10111111
a=01110011
a=1100 0011
a<<3; //a左移三位
a = 0001 1000
(左移相当于乘法,左移一位2,左移两位2^2)
(左边补零用户无法决定,右边舍弃)逻辑右移
a=1110 0011
a>>3; //右移三位
a = 0001 1100
(左边补一用户无法决定,右边舍弃)算数右移
a=1110 0011
a>>3; //右移三位
a = 1111 1100
无符号数:右边丢弃 左边补零
有符号数:
正数:右边丢弃 左边补零
负数:右边丢弃 左边补零(逻辑右移)
右边丢弃 左边补一(算术右移)
data为1字节将data的3、4位清零,其他位保持不变
data为1字节将data的5、6位置1,其他位保持不变
表达式?值1:值2;
欢迎关注公众号“小小创客者”
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。