C语言进阶教程(volataile是干嘛的?)

简介: C语言进阶教程(volataile是干嘛的?)

前言

本篇文章来给大家介绍volataile的意义和具体使用方法,很多同学学习了C语言可能都没有接触过这个关键字,这个关键字看起来是很少使用,但是在嵌入式开发中这个关键字还是比较重要的。


一、volataile意义

关键字 volatile 在C和C++语言中使用,它的主要作用是告诉编译器该变量是随时可能发生改变的,以避免编译器优化掉对该变量的访问或操作。

当你将一个变量声明为 volatile 时,编译器将不会对该变量进行优化,以确保每次访问或操作该变量都是从内存中读取或写入。这是因为 volatile 变量具有可能被外部因素修改的特性,例如多线程/多进程环境下的共享变量、硬件寄存器等。

以下是 volatile 关键字的几个重要意义:

1.可见性:在多线程或多进程环境中,当一个变量被声明为 volatile 时,保证了对该变量的读写都能立即生效,因此可以避免编译器对该变量的优化,确保每次读取或写入都是真实的值。

2.防止优化:编译器在进行优化时,有可能会将某些对变量的读写操作优化掉或进行重排,因为认为这些操作对程序结果没有影响。但对于 volatile 变量,编译器会忽略对其进行的优化,保证操作的执行顺序和预期一致。

3.中断处理:在嵌入式系统或操作系统内核开发中,volatile 通常用于对中断服务例程处理的变量进行声明。由于这些变量会从中断上下文中被修改,需要保证对变量的访问不受编译器的优化影响。


二、volataile和const的火花

1.const表示被修饰的变量不能出现在赋值符号左边

2.volatile表示使用变量时直接从内存中取值

3.const和volatile同时修饰变量的时候并不会互相影响

例子:

这个程序能够编译通过,所以这就印证了我们上面的说法了。

#include <stdio.h>
int main()
{
    const volatile int a = 0;
    int* p = &a;
    *p = &a;
    return 0;
}

总结

总结起来,volatile 关键字用于标识那些可能被外部因素修改的变量,告诉编译器不要对其进行优化,以确保每次访问或操作都从内存中读取或写入变量的值。这对于多线程环境、硬件寄存器以及中断处理等场景非常有用。然而,需要注意,在多线程环境下,volatile 不能保证原子性,还需要结合其他同步机制来确保正确性。


相关文章
|
5月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
1月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
1月前
|
编译器 C语言 C++
VSCode安装配置C语言(保姆级教程)
VSCode安装配置C语言(保姆级教程)
|
5月前
|
IDE 编译器 开发工具
C语言教程:如何进行环境搭建
C语言教程:如何进行环境搭建
|
5月前
|
存储 机器学习/深度学习 编译器
C语言基础简单教程
C语言基础简单教程
|
5月前
|
搜索推荐 编译器 C语言
C语言的简单教程
摘要: 了解C语言中的注释,包括//单行和/*多行*/注释,注意不要嵌套。使用快捷键Ctrl + K, Ctrl + C/U处理注释。C语言的关键字如&#39;int&#39;和&#39;return&#39;有特定含义,通常小写且高亮显示。常量是不可变的,分为不同类型。练习涉及识别不同类型的常量,如整型、实型和字符型。使用printf通过占位符输出常量,例如`printf(&quot;%d&quot;, 10)`。作业包括根据占位符输出个性化信息,如学校名字、高考分数和女朋友的详细信息,并掌握在不同情况下使用\n进行换行。
|
5月前
|
数据库 C语言
C语言进阶 文件操作知识(上)
C语言进阶 文件操作知识(上)
39 3
|
5月前
|
存储 C语言
C语言进阶 文件操作知识(下)
C语言进阶 文件操作知识(下)
37 2
|
5月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
49 0
|
5月前
|
存储 C语言 C++
【C语言刷题系列】水仙花数的打印及进阶
【C语言刷题系列】水仙花数的打印及进阶