盘点C语言中你不知道的小细节


0UL/1UL

0UL 表示 无符号长整型 0
1UL 表示 无符号长整型 1

一般的 1 没有后缀,系统默认指定的类型为int,即有符号的整型数。

除此之外还可以将lu自由组合形成多种后缀(不区分大小写),单独添加也没问题,例如:==2u,3lu,4Lu==。

主要的作用,我只在keil编译中遇到过,在宏定义中将1 << 16这类操作,默认的是有符号的,需要将 1 改成 1ul 无符号长整型。

参考自:c语言中的0UL或1UL是什么意思

volatile

首先我们来看volatile在维基百科中的一些简介,有个大概的了解:

在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性。通常,volatile关键字用来阻止(伪)编译器认为的无法“被代码本身”改变的代码(变量/对象)进行优化。如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

当用volatile声明变量时,则表示该变量随时可能发生变化,避免因为编译器对代码优化导致读脏数据,例如

static int a;
void main(){
    a = 0;
    while (a != 255);
}

一个执行优化的编译器会提示没有代码能修改a的值,并假设它永远都只会是0。因此编译器将用类似==while (true);==的无限循环替换函数体;但是a可能指向一个随时都能被计算机系统其他部分修改的地址,例如CPU的硬件寄存器, 上面的代码永远检测不到这样的修改。如果不使用volatile关键字,编译器将假设当前程序是系统中唯一能改变这个值部分。 为了阻止编译器像上面那样优化代码,需要使用volatile关键字:

static volatile int a;

这样修改以后循环条件就不会被优化掉,当值改变的时候系统将会检测到。

参考自:Volatile变量


文章作者: Mahoo Huang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mahoo Huang !
评论
 上一篇
Win10子系统Ubuntu下配置Jupyter Notebook并实现内网穿透 Win10子系统Ubuntu下配置Jupyter Notebook并实现内网穿透
之前看到有朋友在服务器上,搭建了Jupyter Notebook(一个笔记本,支持多种编程语言),觉得挺好的,自己也想弄个用用,无奈没有服务器,只好另寻他径。 启用Win10子系统网络上有很多教程,就不赘述了: 手把手教你启用Win10的
2019-11-13
下一篇 
STM32的SysTick定时器初体验 STM32的SysTick定时器初体验
注:本文属博主学习时所作笔记,内容源大参考于野火的《零死角玩转STM32F103》以及部分网络资料,笔记内容仅作为自己参考,免去频繁查询参考手册的麻烦,如有错误,还请指出! SysTick介绍SysTick 属于CM3内核的外设,它可以产生
2019-11-11
  目录