C 中 const 和 volatile 限定符的用法区别?

2023-12-14

我已经回答了问题@C 中 const 指针和 volatile 指针有什么区别?我理解的解释是:

const 修饰符意味着此代码不能更改变量的值,但这并不意味着不能通过此代码之外的方式更改该值。 然而,易失性表示“此数据可能会被其他人更改”,因此编译器不会对该数据做出任何假设。

这意味着这两种类型的变量都可以通过外部事件更改。

那么 const 和 volatile 在使用上的区别在哪里呢?

在 C 中,编译器优化对 const 有效吗?


volatile 和 const 在很多方面都有所不同,它们是两个截然不同的特性。

将变量声明为 const 绝不意味着“我希望在程序外部修改该变量”,我不确定您从哪里得到这个想法。如果您希望在代码外部修改 const 变量,则必须将其声明为volatile const或者编译器可能会假设该变量从未更改。

默认情况下,普通 const 变量就像任何类型的变量一样,它们根本无法由程序本身修改。

就像普通变量一样,const 变量的行为在很大程度上取决于它们声明的范围。大多数情况下,它们是在文件范围内声明的,然后它们的行为就像具有静态存储持续时间的其他变量一样,只不过它们(可能)保存在内存的不同部分。如果它们在本地范围内声明,则当调用它们所在的函数时,它们可能会不时发生变化。

因此,在很多情况下 const 变量都可以被优化。一种常见的优化是“字符串池”,编译器检查相同的常量字符串文字是否在代码中出现两次,然后为它们使用相同的地址。如果您期望从外部源更改此类字符串,但没有将它们声明为易失性,那么您会遇到奇怪的错误。

至于 volatile 变量,它们可能会被外部源修改,但也可能会被程序修改,这与 const 变量不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中 const 和 volatile 限定符的用法区别? 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标

随机推荐

  • 当我使用 MKL 时,为什么 Tensorflow 会发出有关 AVX2 的警告?

    我正在使用具有 MKL 支持的 Tensorflow Anaconda 发行版 from tensorflow python framework import test util test util IsMklEnabled 这段代码打印T
  • 如何暂停和恢复 javascript 计时器 [重复]

    这个问题在这里已经有答案了 我有一个工作正常的计时器 但我需要能够暂停并在那之后恢复它 如果有人能帮助我 我将不胜感激
  • getUserMedia 在 Android Chrome 上冻结在第一帧

    我在桌面浏览器上有一个支持 getUserMedia Api 的工作代码 我可以在 div 中正确地看到网络摄像头的视频预览videoPreview 然而 当在 Android 设备上运行时 当我接受在 Chrome 浏览器中共享照片时 相
  • 在 JavaScript 中使用 JSON 将数组存储在 localStorage 中

    我已经参考了这个问题并为我工作 so q1 现在的问题是我使用 JSON stringify 和 JSON parse 将数组存储在 localStorage 中 但是 当我再次运行代码并尝试在 localStorage 上使用 JSON
  • JSF 2:未为错误页面呈现 Facelets 组合(模板)

    我在 Java EE 6 应用程序服务器 GlassFish v3 中使用 JSF 2 0 和 Facelets 我在 web xml 中配置了一个异常错误页面
  • Javascript Fullcalendar - 复制事件

    我在我的项目中使用 Fullcalendar http arshaw com fullcalendar 它通过 json 源获取事件 我想为用户提供将日历上的一个事件复制到另一天的选项 并且我想使用拖动来实现这一点 嗯 这是客户的要求 但拖
  • gmaps4rails 单标记自动缩放

    我正在尝试遵循答案here当地图上显示单个标记时缩小一点 默认情况下 我已经尝试了下面的代码 并生成了工作地图 但是更改 setZoom 没有效果 另外 我从 firebug 收到以下错误 下面的代码
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 我如何知道 `git gc --auto` 是否做了什么?

    我在跑git gc auto作为自动保存脚本的一部分 我想进行进一步的清理 如果git gc auto已经做了一些事情 但我想避免麻烦 如果git gc auto感觉不需要做某事 有没有办法检查返回值git gc auto 或者事先检查是否
  • 如何将wav文件中的数据读取到数组

    我需要将 wav 文件的所有样本放入一个数组 或者两个 如果您需要这样做以保持立体声 以便我可以对它们进行一些修改 我想知道这是否容易完成 最好没有外部库 我没有阅读声音文件的经验 所以我对这个主题了解不多 这段代码应该可以解决问题 它将波
  • 未通过 Smart Lock API 在应用程序中检索到关联网站的密码

    I ve 关联我的 https 网站和应用程序以共享存储的凭据并收到了该协会已上线的确认信息 但是当我致电CredentialsApi request 方法在我的应用程序中 我无法从我的网站检索使用 Chrome 密码管理器保存的任何凭据
  • 处理我的 Android 应用程序中的文本视图链接单击

    我目前正在 TextView 中渲染 HTML 输入 如下所示 tv setText Html fromHtml a href test test a 显示的 HTML 是通过外部资源提供给我的 因此我无法随意更改内容 但我当然可以对 HT
  • 片段中的函数使模拟器崩溃

    当我将函数放入其中时发生错误onCreateView in menu1 Fragment java 提前抱歉 因为我也会放置我的日志 所以这可能会使我的帖子有点大 所以我会告诉你布局 我是新来的 很抱歉有很多问题 如果我不添加该函数 代码就
  • 记录有共同的基类吗?

    在 NET 类型系统中 所有引用类型都派生自System Object 所有值类型来自System ValueType我认为 是否也有一个共同的基类 record类型源自 如果没有 为什么不呢 是否还有一个所有记录类型派生自的公共基类 不
  • 投射给孩子

    我实际上想做的是投射一个构造的moneypunct to the punct facet in 这个问题无需编写复制构造函数 如下所示这个答案 但为了写一个最小 完整 可验证的示例假设我有这两个课程 class Parent public
  • Android Admob 空间不足,无法展示广告

    使用中提供的代码AdMob 网站 这是我的 xml
  • php 字符串像 python 的“””“””一样转义?

    你好 我想知道是否有一种简单的方法来转义 php 中的字符串 在Python中我使用 并且它们之间的所有内容都被转义 所以当使用特殊字符时它会被忽略 我有一些文本需要回显 手动转义所有内容都需要很长时间 php有内置类似的功能吗 thank
  • 尝试访问 Android 中的 SQLite 数据库时,如何修复 SQLiteOpenHelper.getDatabaseLocked 错误?

    我正在尝试从 Sqlite 数据库检索一些数据 但是当我尝试使用 getTaskSent 方法检索数据时 出现以下错误 谁能建议我解决以下错误 E AndroidRuntime 23159 at android database sqlit
  • Django AND .htaccess 重写/重定向,这可能吗?

    是否可以让 Apache htaccess 重写在到达 django 之前生效 我希望能够指定RewriteRules在优先于 django 的 htaccess 文件中 如果没有匹配的内容 则将其分派到 mod wsgi django 我
  • C 中 const 和 volatile 限定符的用法区别?

    我已经回答了问题 C 中 const 指针和 volatile 指针有什么区别 我理解的解释是 const 修饰符意味着此代码不能更改变量的值 但这并不意味着不能通过此代码之外的方式更改该值 然而 易失性表示 此数据可能会被其他人更改 因此