第一眼见到explicit和volatile可能会一愣一愣的觉得可能是c11或者c14新加的标识符。

其实不是这样,volatile和const两个关键字在C语言的第二个版本KR C的时候就被加入了C标准,他们是两个相对的关键字

const 修饰符表示这是一个常量类型,这个变量的值不会被程序改变

volatile 修饰符表示这个变量可能被编译器以外的行为(譬如内联汇编程序)改变。

修饰常量变量只要和类型紧挨着就可以

int const a = ;
const int a = ;

修饰指针时以*号为分界符号

#include <iostream>
#include <iostream> int main() {
int a = ;
int b = ; const int *p1 = &a;
int const *p2 = &a;
int *const p3 = &a;
const int *const p4 = &a;
int const *const p5 = &a; printf("&a = %X\n", &a);
printf("&b = %X\n", &b); printf("p1 = 0x%X , *p1 = %d\n", p1, *p1);
printf("const int *p1 = &a; \n (*p1) = b;通过p修改a的值\n");
// (*p1) = b;
p1 = &b;
printf("p1 = 0x%X , *p1 = %d\n", p1, *p1);
printf("p2 = 0x%X , *p2 = %d\n", p2, *p2);
printf("int const *p2 = &a; \n (*p2) = b;通过p修改a的值\n");
// (*p2) = b;
p2 = &b;
printf("p2 = 0x%X , *p2 = %d\n", p2, *p2);
printf("p3 = 0x%X , *p3 = %d\n", p3, *p3);
printf("int *const p3 = &a; \n p3 = &b;修改p的指向\n");
// p3 = &b;
(*p3) = b;
printf("p3 = 0x%X , *p3 = %d\n", p3, *p3);
printf("p4 = 0x%X , *p4 = %d\n", p4, *p4);
printf("const int *const p4 = &a; \n 二者都不能修改\n");
// (*p4) = &b;
// p4 = &b;
printf("p4 = 0x%X , *p4 = %d\n", p4, *p4);
printf("p5 = 0x%X , *p5 = %d\n", p5, *p5);
printf("int const *const p5 = &a; \n 二者都不能修改\n");
// (*p5) = &b;
// p5 = &b;
printf("p5 = 0x%X , *p5 = %d\n", p5, *p5);
return ;
}

gcc报错结果

J:\SITP\alg\main.cpp: In function 'int main()':
J:\SITP\alg\main.cpp::: error: assignment of read-only location '* p1'
(*p1) = b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only location '* p2'
(*p2) = b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only variable 'p3'
p3 = &b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only location '*(const int*)p4'
(*p4) = &b;
^
J:\SITP\alg\main.cpp::: error: invalid conversion from 'int*' to 'int' [-fpermissive]
J:\SITP\alg\main.cpp::: error: assignment of read-only variable 'p4'
p4 = &b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only location '*(const int*)p5'
(*p5) = &b;
^
J:\SITP\alg\main.cpp::: error: invalid conversion from 'int*' to 'int' [-fpermissive]
J:\SITP\alg\main.cpp::: error: assignment of read-only variable 'p5'
p5 = &b;
^
mingw32-make.exe[]: *** [CMakeFiles/alg.dir/main.cpp.obj] Error
mingw32-make.exe[]: *** [CMakeFiles/alg.dir/all] Error
mingw32-make.exe[]: *** [CMakeFiles/alg.dir/rule] Error
CMakeFiles\alg.dir\build.make:: recipe for target 'CMakeFiles/alg.dir/main.cpp.obj' failed
CMakeFiles\Makefile2:: recipe for target 'CMakeFiles/alg.dir/all' failed
CMakeFiles\Makefile2:: recipe for target 'CMakeFiles/alg.dir/rule' failed
mingw32-make.exe: *** [alg] Error
Makefile:: recipe for target 'alg' failed

将非法的行注释掉之后可以看到允许修改的内容

J:\SITP\alg\cmake-build-debug\alg.exe
&a = 72FE24
&b = 72FE20
p1 = 0x72FE24 , *p1 =
const int *p1 = &a;
(*p1) = b;通过p修改a的值
p1 = 0x72FE20 , *p1 =
p2 = 0x72FE24 , *p2 =
int const *p2 = &a;
(*p2) = b;通过p修改a的值
p2 = 0x72FE20 , *p2 =
p3 = 0x72FE24 , *p3 =
int *const p3 = &a;
p3 = &b;修改p的指向
p3 = 0x72FE24 , *p3 =
p4 = 0x72FE24 , *p4 =
const int *const p4 = &a;
二者都不能修改
p4 = 0x72FE24 , *p4 =
p5 = 0x72FE24 , *p5 =
int const *const p5 = &a;
二者都不能修改
p5 = 0x72FE24 , *p5 = Process finished with exit code

C++ - explicit和volatile/const的内容的更多相关文章

  1. c++const小结

    C++const简单整理,本文的首次是在博客园发布的,如有错误,欢迎大家指正 博客园链接:http://www.cnblogs.com/Forever-Kenlen-Ja/p/3776991.html ...

  2. C++ const用法小结 (欢迎大家拍砖)

    C++const 关键字小结 const 是constant的缩写,本意是不变的,不易改变的意思. const 在C++中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数. 一.cons ...

  3. __I、__O 、__IO volatile是什么?怎么用? .

    这是ST库里面的宏定义,定义如下: #define __I volatile const /*!< defines 'read only' permissions */ #define __O ...

  4. c语言,volatile

          一.意义: 该关键字的意义就是表示定义的变量值随时都会改变,必须从变量的地址处读取值,所以只有这个变量在使用过程中可能被改变(比如中断程序),就需要用这个关键字说明. )volatile, ...

  5. C/C++中const关键字的用法及其与宏定义的比较

    1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 ; ; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用c ...

  6. 1.C和C++区别,以及const分析

    从本章起开始从0学习C++,本章主要内容: 1)C和C++的基本区别 2)C和C++的const区别 1.C++和C区别 1.1 C++更强调语言的实用性,所有变量都可以在需要时再定义 比如: ;i& ...

  7. C/C++中const关键字的用法及其与宏常量的比较

    1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 ; ; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用c ...

  8. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

  9. volatile的陷阱

         对于volatile关键字,大部分C语言的教程都是一笔带过,并没有做太深入的分析,所以这里简单的整理了一些 关于volatile的使用注意事项.实际上从语法上来看volatile和const ...

随机推荐

  1. org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException

    使用Intelij Idea时,报错如下: org.apache.catalina.core.StandardContext.listenerStart Error configuring appli ...

  2. numpy.unpackbits()

    numpy.unpackbits numpy.unpackbits(myarray, axis=None) Unpacks elements of a uint8 array into a binar ...

  3. C++ 静态数据成员和静态成员函数

    一 静态数据成员: 1.静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中,因为这样做会引起重复定义这样的错误.即使加上#ifndef ...

  4. GridView自定义分页样式(上一页,下一页,到第几页)

    今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1). 图(1)GridView分页效果 自定义G ...

  5. Java学生信息增删改查(并没用数据库)

    一个泛型的应用,Java版本增删改查,写的简陋,望批评指正 2016-07-02 很久前写的一个程序了.拿出来存一下,不是为了展示啥,自己用的时候还可以看看.写的很粗糙. import java.io ...

  6. .net调用web邮箱发送邮件(转载)

    public static void SendEmail() { System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient( ...

  7. vmware14中安装centos7并使用docker发布spring-boot项目

    1.vmare中centos7安装(同一路由器无线网络下) 1.1选择桥接模式 1.2修改配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33(这里不一 ...

  8. NPOI创建doc

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. 将Boost库添加到Visual Studio 2017

    在windows 环境中,一般比较推荐的打包软件的方式是,将自己所需要的共享库放在软件自己的文件夹中,并且避免与其它的软件共用.除非是微软的官方组件,比如微软自家的VC Runtime. Boost库 ...

  10. .net 4.0的Lazy<T>方法,反射实现延迟加载。

    //自己山寨.public class YaLazy<T> { private bool _isValueCreated = false; public bool IsValueCreat ...