关键字volatile有什么含意并给出三个不同的例子。

答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

2). 一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)

3). 多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1). 一个参数既可以是const还可以是volatile吗?解释为什么。

2). 一个指针可以是volatile 吗?解释为什么。

3). 下面的函数有什么错误:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

下面是答案:

1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

关键字volatile的含意相关推荐

  1. C语言面试题小练——第10天:宏定义一年的秒数、变量定义练习、关键字volatile有什么含意

    文章目录 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 2. 用变量a给出下面的定义 3. 关键字volatile有什么含意?并给出三个不同的例子. 1. 用 ...

  2. C语言基础 — 关键字volatile有什么含意? 三个不同的例子。

    关键字volatile有什么含意? 并给出三个不同的例子. 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量 ...

  3. C++关键字Volatile的作用

    2019独角兽企业重金招聘Python工程师标准>>> 和const对应,const表示变量是恒定不变的,而Volatile则相反,表示变量随时都可能被改变,因此每次获取变量都需要重 ...

  4. C语言:关键字volatile详解!

    一.volatile 介绍 参看:volatile详解 参看:C Language Keywords Indicates that a variable can be changed by a bac ...

  5. C语言再学习 -- 关键字volatile

    上周确实事情挺多的,年会.公司聚餐,一到过年就有忙不完的事分心.还好C语言再学习总结的已经差不多了,年前也不展开别的了,接下来这十几天.总结几篇典型的面试题吧. 言归正传,接下来看看关键字 volat ...

  6. 每日一题(17)—— 关键字volatile的作用和三个不同的应用场合

    关键字volatile的作用和三个不同的应用场合 作用:防止编译器优化: (1)并行设备的硬件寄存器(如状态寄存器):// #define S5PV210_GPIO_DATA (*(volatile ...

  7. C语言中的关键字“ volatile”的用法(摘)

    C语言中的关键字" volatile"的用法(摘) volatile 这个ANSI C 关键字在经典的C 教程中很少提及,高层编程的人也可能永远都 不会用到,但是作为嵌入式开发者来 ...

  8. 关键字volatile有什么含意 并给出三个不同的例子

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存 ...

  9. 关键字volatile有什么含意?并给出三个不同的例子

    一个定义为volatile的变量就是说它可能会意想不到的改变(改变它的情况有很多,例如操作系统,硬件,线程),这样,编译器就不会去假设这个值,也就是说,当优化器读到这个值时就会小心翼翼的去重新读取这个 ...

最新文章

  1. Thrift源码解析--TBinaryProtocol
  2. 谷歌称居家办公影响工作效率!2021 年将回归线下办公
  3. boot定时任务开启和关闭 spring_Spring之定时任务实践
  4. 【转载】一天之内上手.Net+WAP项目
  5. Spring学习总结(19)——Spring概念详解
  6. Delphi通过ADOQuery控件实现Sqlserver数据库多结果集的数据打印
  7. html中h标签可包含a标签,HTML中H标签P标签(Paragraph)img标签(image)a标签(anchor)
  8. 线程的故事:3 位“母亲”成就了优秀的我!
  9. CSDN Chrome插件更新:用CSDN的方式让开发再快一点
  10. 前端基础学习之Html标签
  11. XAF 应用程序模型架构
  12. 第四季-专题14-串口驱动程序设计
  13. 【信号与系统|吴大正】3:离散系统的时域分析
  14. CSS Sprite、CSS雪碧图应用实例
  15. SAS: PROC IMPORT简单入门介绍
  16. 【老生谈算法】matlab实现方位角计算源码——方位角计算
  17. pancakeswap 开盘抢跑机器人 (附代码)
  18. NVIDIA TX2---Tegra架构介绍
  19. 解读机械图样——局部视图
  20. h5 数字变化_那些H5用到的技术(6)——数字滚动特效

热门文章

  1. 10、《每周一点canvas动画》——移动物体(2)
  2. 仓库处理中 无法修改_Shopee SLS仓库异常件退货流程
  3. STM32 AD7685 AD7684 AD7686 AD7687 AD7683 AD7680系列调试记录
  4. 【SpringBoot】61、SpringBoot中使用谷歌身份验证器(Google Authenticator)实现二步身份验证
  5. 仙道录 第一卷 天道门 第二章 桃花镇
  6. DNS域名解析(理论+正项解析)
  7. Java版spring cloud 企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  8. 在winfrom窗体中使用漂亮的窗体样式。
  9. 社会生活-社会生活十大著名法则:社会生活十大著名法则
  10. 适配全面屏方法(无效)