首页 > 其他分享 >C 语言 volatile 关键字

C 语言 volatile 关键字

时间:2022-11-03 13:46:46浏览次数:71  
标签:语言 int 代码 关键字 编译器 volatile main 优化

《C Primer Puls》 是这样解释关键字的:关键字是C语言的词汇,由于编译器不具备真正的智能,所以你必须用编译器能理解的术语表示你的意图。
volatile关键字告诉编译器该变量是易变的,无非就是希望编译器去注意该变量的状态,时刻注意该变量是易变的,每次读取该变量的值都重新从内存中读取
使用GCC编译器时,在编译命令加入 -On ; n : 0 ~ 3,数字代表优化等级,数字越大,优化级别越高。
例如:
gcc -O2 -O hello hello.c 使用 O2 优化级别编译 hello.c

使用GCC编译器生成汇编gcc -S -o main.s mian.c

点击查看代码
int i = 10;
int main(void){
 
    int a, b;
 
    a = i;
    ...//伪代码,里面不含有对 a 、 b 以及 i的操作
    b = i;
 
    if(a == b){
        printf("a = b");
    }
    else {
        printf("a != b");
    }
    
    return 0;
}
如上代码,如果选择编译器优化,可能会被编译成如下代码(当然不是在C语言层面上优化,而是在汇编过程优化,只是使用C程序举例):
点击查看代码
int i = 10;
int main(void){
 
    int a, b;
 
    a = i;
    ...//伪代码,里面不含有对 a 、 b 以及 i的操作
    b = i;
 
    printf("a = b");
   
    return 0;
}

因为在仅仅从main主函数来看,a == b是必然的,那么在什么情况,a 和 b不是必然相等呢?
  1. i 是其他子线程与主线程共享的全局变量,其他子线程有可能修改 i 值;

  2. i 是中断函数与主函数共享的全局变量,中断函数有可能修改 i 值;

  3. i 属于硬件寄存器,CPU可能通过硬件直接改变 i 的值(例如寄存器的标志位)

————————————————
版权声明:本文为CSDN博主「ora___」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38815998/article/details/102840096

标签:语言,int,代码,关键字,编译器,volatile,main,优化
From: https://www.cnblogs.com/zkx98/p/16685698.html

相关文章

  • 《STM32MP1 M4裸机HAL库开发指南》第十二章 C语言LED灯实验
    第十二章C语言LED灯实验为了加深理解汇编语言以及汇编初始化过程,第十一章我们使用汇编来控制LED0。本章节我们来学习使用C语言来控制LED0,实际的开发中我们接触最多的就是C......
  • Go语言躲坑经验总结
    作者|百度小程序团队导读本文收集一些使用Go开发过程中非常容易踩坑的case,所有的case都有具体的代码示例,以及针对的代码修复方法,以避免大家再次踩坑。通常这些坑的特点就......
  • static关键字详解
    1.静态变量和静态方法静态属性可以用对象调用,也可以直接用类名来调用静态方法可以用对象调用、类名调用、直接调用通常直接用类名调用静态属性和静态方法2.静态代码块......
  • c语言中多维数组的指针表示
    c语言中多维数组的指针表示学c的时候碰见了下面这道题修改下面的程序,让它从数组计算变成指针计算:/*rain.c--findsyearlytotals,yearlyaverage,andmonthlyav......
  • C语言 结构体、联合、位段
    例如,有一些寄存器,寄存器有一些位,每个位都控制不同的设置,要是想单独设置某一个位的值,用位段就是一个比较好的方法,寄存器例子:  第一种方法:如果内存小的话可能造成堆栈......
  • 开发语言介绍——Java
    开发语言介绍——Java一、基本说明1.Java语法的特点关键字都是小写字母标识符没有长度限制使用Unicode编码Java是一种强类型的语言,变量在编译之前一定要被显示的声明......
  • Mysql的INTERVAL()函数和INTERVAL关键字
    Mysql的INTERVAL()函数和INTERVAL关键字  一,INTERVAL()函数INTERVAL()函数可以返回分段后的结果,语法如下:INTERVAL(N,N1,N2,N3,..........)其中,N是要判断的数值,N1,N2......
  • 如何判断点是否在多边形内部 (C语言版)
    概述这是图形学中的一个经典问题(point-in-polygon),一种比较简易的判断方法是射线法,就是以判断点作为端点,朝着任意方向绘制一条射线。如果射线与多边形交点为奇数个,就说明此......
  • C语言 模拟实现字符串函数 看着一篇够了
    C语言模拟实现字符串操作的库函数求字符串长度strlen思路1.如果碰到\0就代表字符串已经到了末尾size_tmy_strlen(constchar*str){ assert(str!=NULL); //......
  • 四舍六入五成双(C语言版)
    四舍五入的小细节计算机的四舍五入与我们数学学的还是有点区别,下面开始讲解吧四舍五入的规则:如果需要约位的数<=4,舍去不进位如果需要约位的数>=6,舍6进1如果需要约......