关键字(五):const和volatile

news2024/11/19 0:30:44

关键字

  • 一."令人误解"的关键字—const
    • 1.const的基本特质
    • 2.const的各种应用场景
      • 1.修饰变量
      • 2.修饰数组
      • 3.修饰指针
      • 4.修饰函数的参数
      • 5.修饰返回值
  • 二.最易变的关键字—volatile

在这里插入图片描述

一."令人误解"的关键字—const

1.const的基本特质

在这里插入图片描述

简单的示例

在这里插入图片描述

const所修饰的变量不可像上面那样被直接修改,那它可不可以被间接修改呢?

在这里插入图片描述

答案是可以的,能够通过指针的方式进行间接的修改

结论:const修饰的变量并非真的不能被改变

那么const的意义何在呢?

1.让编译器进行直接修改式的检查(如果被直接改变量被直接修改了,会报错方便我们找错)
2.直观的告诉程序员,这个变量不要改
换句话说const只是一种弱型约束,更多的起一个提醒的作用

const修饰的变量在很多时候被认为是常量,但其实它虽然具备常量的一些特征,但它依然不属于常量,看下面例子

在这里插入图片描述

在VS中,数组的大小只能用1,2,3这样的数字或者宏定义来表示,从这也可以侧面看出const所修饰的变量并不是常量

2.const的各种应用场景

1.修饰变量

这上文已经说明了,就不再重复

2.修饰数组

在这里插入图片描述

在这里插入图片描述

跟修饰变量一样的原理,用const修饰数组后,数组内的每一个元素都不能被修改

3.修饰指针

在这里插入图片描述

这里如果对于指针还不够了解的话可以看看这篇博客 什么是指针,接下来逐个解析

在这里插入图片描述

第一种情况

在这里插入图片描述

这里我们很明显能看到改*p是不行的,也就是如果const这么放,说明 * p是不能改的,但p是可以改的

在这里插入图片描述

这样写也是一样的效果

情况二

在这里插入图片描述

情况三

在这里插入图片描述

4.修饰函数的参数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这种写法其实是一种预防性编程,你可以看看库函数里的参数几乎都使用了const,理论上你不加conset也能编译,但加上conset就是为了防止程序员不小心改变了参数 ,从而造成错误,总的来说这是一种好的编程习惯

5.修饰返回值

在这里插入图片描述

在这里插入图片描述

这里会给出警告,告诉我们应当加上const,保持类型一致

在这里插入图片描述

加上以后就能防止我们误改返回值

总之,在返回值上加conset就是为了避免程序员误改函数返回值,从而造成错误(一般用来修饰指针函数,像内置函数(int…)编译器是不会警告的,因为没有意义)

二.最易变的关键字—volatile

在这里插入图片描述

翻译一下就是如果不用这个关键字,那么编译器很有可能将我们的代码进行一些优化,那么有可能你的代码就会出现问题,而volatile就是禁止编译器进行优化(目前我们所写的程序都是单进程所以不必用到这个关键字,但如果在双进程程序里就有可能会用到它)

这里举一个不是很恰当的例子

在这里插入图片描述

如果flag等于1,那么每进行一次循环,cpu都会判断一次是否成立,就是循环一次,将flag的值拿到cpu里判断一次。因为flag的值是没有改变的,而这样做会比较繁琐,故编译器进行优化,直接将flag的值放到寄存器内,每次检测cpu只需要检测寄存器内的值就可以了。相当于cpu就不会读取编译器里的flag的值(这种情况也被叫做内存覆盖)。当然现在看是没问题的,因为目前只是单线程,当有多线程操作时,有可能flag的值会被其他的”流“所修改,但此时cpu不会读取编译器里的flag数据。换句话说有可能flag已经被改为0了,而cpu读取的依然是1,所以会发生错误

所以为什么volatile"冷门"呢?因为目前我们不会存在while(1)在循环时,突然1被改为0的情况,因为我们是单线程

ps:以上的例子其实有许多漏洞,但只是为了方便我们理解。具体的实验太复杂了,涉及到汇编和Linux的操作,故不再演示

在这里插入图片描述

有可能我们会遇到这样的代码,从字面意思上来看,const是保持,要求我们不要改变a,而volatile是易变,又要求改变a,是不是发生矛盾了呢?其实并不是的

在这里插入图片描述

const考虑的是如何写,volatile考虑的是如何读,这当然不发生冲突啦

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计海南与东北的美食文化差异及做法的研究展示平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java在线图书馆信息管理系统g6977

好的选题直接决定了毕业设计好坏,甚至决定了能否毕业。今天,我们就来聊一聊毕设该怎么选题。 这里分三个选题标准。 第一,参考所在学校往年选题类型和难度 可以向学长学姐了解往年的选题类型,以及使用的技术,不用向…

Kotlin如何延时准确的循环执行事件,比如倒计时或每一秒执行一次事件

前言 延时循环执行事件很简单,且有很多方式,但想要延时相对精确,就需要稍微设计一下了 普通的方案 线程内阻塞的方案 这种方案很简单,示例代码如下 while (true){block()//执行逻辑Thread.sleep(1000)//延时1秒} 但缺点也是显而易见,其是线程阻塞的,比较浪费资源 异步或挂…

26-Vue之ECharts-柱状图

ECharts-柱状图前言柱状图实现步骤柱状图常见效果标记显示前言 本篇来学习下柱状图的实现 柱状图实现步骤 ECharts 最基本的代码结构准备x轴的数据准备 y 轴的数据准备 option , 将 series 中的 type 的值设置为: bar <!DOCTYPE html> <html lang"en">…

【算法】动态规划 ⑥ ( 骑士的最短路径 II | 问题分析 | 代码示例 )

文章目录一、问题分析二、代码示例骑士的最短路径 II : 在 国际象棋 中 , 骑士 类似 与 象棋 中的 马 , 走 " 日 " 字 格子 ; 骑士有 8 种走法 : " 日 " 字 格子 , 参考 百度百科 左走一格向前走两格左走一格向后走两格左走两格向前走一格左走两格向后走…

Jackson注解自定义数据脱敏策略

Jackson注解自定义数据脱敏策略1.前言2.脱敏注解3.定义好一套需要脱敏的规则4.自定义JSON序列化5.在实体类上标注对应的脱敏规则5.写一个接口进行测试1.前言 有时候&#xff0c;我们返回给前端的数据需要脱敏&#xff0c;避免用户信息被泄漏&#xff0c;就像你点外卖一样&…

node.js安装+卸载,npm+cnpm安装+卸载 vue安装+卸载

node.js安装卸载&#xff0c;npmcnpm安装卸载 vue安装卸载 使用指令整理&#xff1a; #获取node.js版本号&#xff08;验证电脑是否安装&#xff09; node -v #node.js官网地址 #https://nodejs.org/en/ #获取npm版本号&#xff08;npm:Nodejs软件包管理工具)&#xff08;验证…

unix网络编程(四) 线程池并发服务器

线程池并发服务器概念线程池和任务队列任务队列线程池操作线程池的函数初始化线程池销毁线程池向线程池添加任务任务的回调函数测试概念 线程池是一个抽象概念&#xff0c;可以简单的认为若干线程在一起运行&#xff0c;线程不退出&#xff0c;等待有任务处理。 为什么要有线程…

通过选择集获取元素

通过使用内置对象document上的getElementsByTagName方法来获取页面上的某一种标签&#xff0c;获取的是一个选择集&#xff0c;不是数组&#xff0c;但是可以用下标的方式操作选择集里面的标签元素 <!DOCTYPE html> <html lang"en"> <head><me…

Javaweb安全——Weblogic反序列化漏洞(一)

从原生反序列化过程开始谈起。 原生反序列化 序列化就是把对象转换成字节流&#xff0c;便于保存在内存、文件、数据库中&#xff1b;反序列化即逆过程&#xff0c;由字节流还原成对象。 大致是这么一个过程&#xff0c;简单画了个图&#xff1a; 测试类如下&#xff1a; p…

spring mvc——@RequestMapping注解的作用

RequestMapping注解 1、RequestMapping注解的功能 从注解名称上我们可以看到&#xff0c;RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来&#xff0c;建立映射关系。 SpringMVC 接收到指定的请求&#xff0c;就会来找到在映射关系中对应的控制器方法来处理…

从源码编译linux内核并运行一个最小的busybox文件系统

从源码编译linux内核并运行一个最小的busybox文件系统 环境基础&#xff1a; 开发环境&#xff1a;ubuntu 18.04 linux源码版本&#xff1a;linux-4.9.229 busybox源码版本&#xff1a;busybox-1.30.0 qemu-system-x86_64版本&#xff1a;2.0.0 这篇文章将按照如下4个步骤来…

【hexo系列】01.hexo环境搭建及github.io搭建

文章目录基础环境要求安装hexohexo初体验创建hexo工程初体验创建自己的第一篇笔记推送到github网站新建github.io推送到github推送到github(ssh方式 免密)参考资料基础环境要求 检测Node.js是否安装成功&#xff0c;在命令行中输入 node -v 检测npm是否安装成功&#xff0c;在…

机器学习中的数学原理——多重回归算法

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——多重回归算法》&#xff01; 目录 一、什么是多重回归 二、案…

物联网开发笔记(60)- 使用Micropython开发ESP32开发板之SPI接口控制Micro SD卡TF卡模块

一、目的 这一节我们学习如何使用我们的ESP32开发板来通过SPI接口控制Micro SD卡TF卡模块。 二、环境 ESP32 SPI接口控制Micro SD卡TF卡模块 Thonny IDE 几根杜邦线 接线方法&#xff1a; Soft SPI接线说明 # 接线说明: # MISO -> GPTO13 # MOSI -> GPIO12 # SCK …

[附源码]Python计算机毕业设计SSM基于的楼盘销售系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SpringCloud入门实战-Ribbon

SpringCloud入门实战-Ribbon使用 原创目录概述需求&#xff1a;设计思路实现思路分析1.Ribbon原理2.Ribbon负载均衡策略参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a bet…

计算机软技术,如何画好一张架构图?

什么是架构图&#xff1f; 如何画好一张架构图&#xff0c;要做好这件事情首先要回答的就是什么是架构图。我们日常工作中经常能看到各种各样的架构图&#xff0c;而且经常会发现大家对架构图的理解各有侧重。深入追究到这个问题&#xff0c;可能一下子还很难有一个具象的定义…

动态路由协议RIP

数据来源 一、动态路由 基于某种协议实现 1&#xff09;动态路由拓补图 2&#xff09;动态路由特点 减少了管理任务占用了网络带宽 3&#xff09;动态路由协议概述 路由器之间用来交换信息的语言 4&#xff09;度量值 跳数、带宽、负载、时延、可靠性、成本 跳数&#xff1a…

JavaScript数据结构【数组---for...of循环迭代】

继for循环&#xff0c;和forEach方法迭代数组后&#xff0c;要想迭代数组的值还可以用for...of循环 使用&#xff1a; // for...of循环示例 let array [1, 2, 3] for (let key of array) {console.log(key); } /* 输出&#xff1a;123 */ 可以看到&#xff1a;使用for...of…