嵌入式Linux(五)—嵌入式C语言(运算符2)

本文详细介绍了C语言中的类型修饰符,包括auto、register、static和extern,以及它们在内存管理和代码优化中的作用。此外,还讲解了运算符的用法,如算术、逻辑、位运算和赋值运算,特别是逻辑运算符的短路特性。同时,文章探讨了内存访问和控制结构,如if-else、switch-case和循环,并提到了goto语句的使用。最后,讨论了寄存器与内存之间的关系及其对程序性能的影响。
摘要由CSDN通过智能技术生成

目录

逻辑结构

类型修饰符

auto

register 

补充:(内存和寄存器的关系?)

Static(静态)

 Extern(外部申明)

Const

Volatile

运算符

算数运算操作

逻辑运算

 || 或     &&与

?: 

位运算

移位

&,|

^,~

赋值运算

内存访问 


逻辑结构

if(条件表达式)

xxx(功能)

else 

yyy(功能)

多可能性分支:switch(整型数字)

case 1 :

break;

case 2 :

break;

循环:for(次数)   while(条件)   do(while)

goto:同一个函数中的跳转

类型修饰符

相较于数据类型关键字限定的是资源土地的大小

类型修饰符修饰的是资源土地的位置

auto

最日常使用的类型

定义的时候什么都不写就默认auto,由系统默认分配(在内存中)

分配的区域如果在{}中,即属于栈空间

register 

限制变量定义在寄存器上的修饰符

当数据过于被频繁使用可以放在寄存器中

如果寄存器不足

系统还是会把a放到内存中去(&无法对寄存器中的数据取地址) 

补充:(内存和寄存器的关系?)

 

左侧是在cpu中的寄存器,cpu执行操作时直接和寄存器通信是很快的

而右侧是内存,cpu和内存中的资源进行通信相对来说就比较慢

所以寄存器的大小一定程度上就体现了Cpu的执行效率

因此在cpu售卖时提到的XXX缓存即代表其寄存器中可以存储数据的大小 

Static(静态)

1.对于函数内部的变量

int fun()
{
    static int a;
}

2.对于函数外部的变量

static int a;
int fun()
{
    
}

3.修饰函数

static int fun();

 Extern(外部申明)

Const

常量定义=>只能做到是一个只读的变量,通过某些方法还是可以改变它

Volatile

告知编译器编译方法的关键字,不优化编译

底层编程中比较常用

运算符

算数运算操作

加减乘除不再叙述

Tips:处理器中其实是没有乘除操作的,乘法除法往往要经过多个周期,甚至是通过软件的模拟方法实现乘除法 

%:求模,求余数

 由于任意一个变量和m求模

得到的范围就是【0——m-1】在取范围时可以使用

  • 可以被用为求某进制下该数的个位上的数字
  • 循环下标(在循环数据结构中)

逻辑运算

用1和0来表示真和假

 || 或     &&与

这里有一个优先级的关系

其导致的是

A || B   不等于    B || A

其原因为 如果编译器已经判断A是真的,那编译器接下来就会直接判断A||B表达式为真

B中包含的语句不会再被执行

所以两者并不能画上等号,执行关系优先级是不相同的

重点在于区别位运算中取反的操作

int a=0x0

! 整体取反=》31个0加1(4个字节)

~  逐位取反=》32个全转成1  (0xffff)

?: 

就是if else 

位运算

移位

左移<<    右移>>

我们可以把操作看成乘法

由于位运算都在二进制下

因此左移就可以看成乘2(10进制)操作

0001  左移一位   0010

 如果是数字的移位呢?

计算机中对负数数据的存储(8bit)是其)(符号位不动其他取反)反码+1

也就是说-1在计算机中的展示就是1111 1111

-2的展示就是1111 1110 所以左移乘2的操作依旧适用

右移:>>

此处有符号数和无符号数就有了差别

        int a

有符号数中,如果是正数就补1,负数就补0

        unsigned

无符号数默认补0

&,|

对应数字电路的与,或

&:可以起到屏蔽作用,取出作用(可以拿来设计低电平:clr)

int a=0x1234;
a & 0xff00

//这样的情况下低8bit就被屏蔽了
//高8bit就被取出了

|:可以起保留作用

A|1=1;设置高电平的一种方法 (设计高电平:set)

设置一个资源的bit5为高电平,其他位不改变
int a;
a=(a|(0x1<<5));

清除第五位
int a;
a=a & ~(0x1<<5)

设置4 5 6bit设置为101(?)

为什么不用右移:右移没办法准确知道当前操作系统位数(移植)=> 用取反肯定不会错

^,~

在数学算法中应用的比较多,几乎不用来处理逻辑

做两个数互换

(1)另创数备份一次

(2) a=a^b;
      b=a^b;
      a=a^b;

 取反:逐位取反(和!的真和假有本质区别)

赋值运算

|=  &= 都可以用,实现自更新

内存访问 

():限制符—>限制运算次序

():函数访问fun()

  [ ] :数组->内存访问的ID

 { }:函数体的限制符号 

 ->:地址访问

.:变量访问 

&p:就是取地址

*p:就是指针 

(前提是后面跟的是变量) 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小小小邱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值