嵌入式学习——1——C基础——3

本文详细介绍了GCC编译器的工作流程,包括预处理、编译、汇编和链接四个步骤,同时讲解了C语言的关键概念,如预处理指令、主程序、运算符、printf函数、字符型和整型数据的表示,以及类型转换的自动提升和强制转换。
摘要由CSDN通过智能技术生成

一、GCC编译器的使用

一步到位:gcc xxx.c -o xxx    

四步走:预处理=>编译=>汇编=>链接

        1.预处理:预处理指令解析,头文件展开,宏定义替换,注释删除

                        gcc -E xx.c -o xxx.i

        2.编译:   语法,词法分析,生成汇编程序

                        gcc -S xxx.i -o xxx.s

        3.汇编:   将汇编程序编译生成目标程序(.o),是一个二进制程序

                        gcc -c xxx.s -o xxx.o

        4.链接:   将多个目标程序与相关库(静态库或动态库)进行链接,生成可执行程序

                        gcc xxx.o -o xxx(可执行程序)

二、c语言框架介绍

#include<stdio.h>
//预处理指令:以#开头的都是预处理指令
//inlcude:表示这是一个文件包含指令,在预处理阶段会讲括起来的文件给展开
//<>:表示这是一个系统库里面的头文件:/usr/include
//"":也可以使用双引号括起来一个文件,表示包含指定路径中的某个文件
//stdio:standard buffered input/output,标准缓冲输入输出
//h:表示这是一个头文件,C或C++的头文件,都是以.h结尾


//主程序:主函数,一个程序有且只能有一个名为main的函数
//是整个程序的入口函数,整个程序随着main函数的开始而开始
//随着main函数的终止而结束
int main(int argc, const char *argv[])
//main函数,可以有返回值也可以没有返回值,可以有参数也可以没有参数
//void main();             void main(int argc, const char *argv[])      
//int表示该函数的返回值为整形,也可以是void,无返回值类型,C99标准之后
//一般都为有返回值函数
//括号中表示外部向该函数传递的参数,也可以没有,设置为空的小括号
{
    //argc为外部传递的参数的个数
    printf("argc = %d\n", argc);          //执行参数个数,包含可执行程序自己

    //argv:是一个指针数组,每个元素都是一个字符串
    //访问其中元素可以使用argc[数字]:argc[0]表示第一个参数
    //argv[1]表示第二个外部参数,以此类推
    
    printf("argv[0] = %s\n", argv[0]);
    printf("argv[1] = %s\n", argv[1]);

    
    return 0;
    //有返回值函数的函数,需要使用return语句将相关数据返回
}
//花括号表示作用域,在C语言中,使用花括号来划分功能模块

三、运算符

运算符的种类:单、算、关、逻、条、赋、逗

表达式:由操作数和运算符组成,并且能返回一个确定值的式子,叫做表达式

操作数:参与运算的数据,可以是常量、可以是变量、也可以是一个表达式

             (例如:1+2*3)

运算符:参与运算,能够表示相关运算的数学符号叫做运算符

左值(lvalue)和右值(rvalue)的概念

1、左值和右值的概念是相对于赋值运算符而言的

2、既能够放在等号(赋值运算符)左侧也能放在等号右侧的值称为左值。左值的本质是有地址空间的。例如变量、堆区申请的空间、地址返回的函数返回值

3、只能放在等号右侧的值称为右值。右值的本质是没有地址空间。例如常量、临时值、表达式的结果、值返回的函数返回值

4、在C语言中,所有表达式的结果全部都是一个右值

四、printf

#include <stdio.h>

int printf(const char *format, ...);

功能:向标准输出(stdout)缓冲区中写入一个格式串

关于格式控制符的介绍:

%# :表示输出数据时带的先导符,常用于于八进制和十六进制数据

%0:表示空白位用0补齐

%hh:表示要输出一字节整数(数值类型)----> hhd(有符号数据) hhu(无符号数据)

%h:表示输出两字节整数 ---->hd(有符号) hu(无符号)

%l:表示输出8字节整型 ---->ld(有符号long类型) lu(无符号long类型)

%ll:表示输出long long类型的数据、 ----> lld(有符号long long类型) llu(无符号long long 类型)

%d、%i:输出整数数据

%o:输出8进制数据

%u:输出无符号数据

%x:   输出16进制数据

%e、%E:针对于double类型的数据,以科学计数法的方式打印数据

%f:表示输出小数

%c:输出一字节字符数据

%s:输出一个字符串

%p:输出指针类型的数据(地址,以十六进制展示)

五、字符型数据

1、使用char类型表示字符型数据

2、字符型数据在内存中占 1 个字节

3、计算机识别的是数值型数据,但是字符数据不能被直接识别,为了方便起见,将每个特定的字符通过某种方式转变成数值,然后由计算机识别

4、转变方式中,所用到的密码本,我们称为ASCII码

常用字符以及特殊字符
'\0'    : 0
'0'     :48
'9'     :57
'a'-'z' :97--122
'A'-'Z' :65--90
注意:相同的字符,小写字符的值比大写字符的值大, 相差32
'\a'    :7  警报
'\b'    :8  回退
'\t'    :9  制表符
'\n'    :10 换行
'\r'    :13 回车
'\0ddd' :表示一个八进制数据
'\xddd':表示一个十六进制数据

六、整型数据

短整型:short int
占内存空间大小:2个字节
取值范围:
        无符号:0 --- 65535
        有符号:-2^15(-32768) --- +2^15-1(32767)
输入输出对应的格式控制符
        无符号:%hu
        有符号:%hd    
整型:int     
1、所占内存:4字节32位
2、取值范围:
        无符号:0  ----   2^32-1(42亿+)
        有符号:-2^31 ---- +2^31-1              足以支撑生活中的所有整数,所以,C语言中所有整数默认是int类型
3、输入输出格式
        无符号:%u
        有符号:%d  %i
长整型:long int
1、所占内存:8字节64位
2、取值范围:
        无符号:0  ----  2^64-1 
        有符号:-2^63 --- 2^63-1
3、输入输出格式:
        无符号:%lu
        有符号:%ld

 七、实型数据

双精度实型:double
1、所占字节:8字节
2、精准度:小数点后14--16位左右     所有的小数默认是double类型
3、输入输出格式:%lf
单精度实型:float
1、所占字节:4字节
2、精准度:小数点后7位左右
3、输入输出格式:%f

八、类型转换

自动类型提升、强制类型转换

自动类型提升:

        在运算中,如果参与运算的数据有高字节和低字节类型的数据进行运算时,会将低字节的数据,先自动转换为高字节数据,然后进行运算

但是,通过自动类型提升后的结果是一个临时值,原值的类型依然保持不变、

        注意:该自动类型提升,只对4字节及以上的数据类型有效

         低于4字节的数据进行运算时,都会将其自动类型提升为4字节数据,然后进行相关运算

例如:2 + 3.5
1、原则上是不能直接运算的,因为2是int类型,而3.5是double类型
2、运算时,会将2自动类型提升为double类型,之后跟3.5进行运算
3、其实运算的本质是,2自动类型提升为double类型的数据的临时值 与3.5进行运算 :X + 3.5
4、在类型提升后,只是临时值的类型是double,但是 2 还是int类型

强制类型转换:

           (转换的类型)表达式;

                将表达式结果的类型,强制转换为括号中的数据类型

例如:
    int num  = 2;
    double key = 3.5;
    int value = (int)(num + key);          //将表达式的结果,强制类型转换为int类型
    
常用于:
    int *ptr = (int *)malloc(4);           //将函数调用的结果,强制转换为 int * 类型

        

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数是C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值