特别没前途的C++ - explicit和volatile/const的内容

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

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

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

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

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

int const a = 1;
const int a = 1;

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

#include <iostream>
#include <iostream>

int main() {
    int a = 10;
    int b = 20;

    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 0;
}

gcc报错结果

J:\SITP\alg\main.cpp: In function ‘int main()‘:
J:\SITP\alg\main.cpp:14:11: error: assignment of read-only location ‘* p1‘
     (*p1) = b;
           ^
J:\SITP\alg\main.cpp:17:11: error: assignment of read-only location ‘* p2‘
     (*p2) = b;
           ^
J:\SITP\alg\main.cpp:20:8: error: assignment of read-only variable ‘p3‘
     p3 = &b;
        ^
J:\SITP\alg\main.cpp:23:11: error: assignment of read-only location ‘*(const int*)p4‘
     (*p4) = &b;
           ^
J:\SITP\alg\main.cpp:23:11: error: invalid conversion from ‘int*‘ to ‘int‘ [-fpermissive]
J:\SITP\alg\main.cpp:24:8: error: assignment of read-only variable ‘p4‘
     p4 = &b;
        ^
J:\SITP\alg\main.cpp:26:11: error: assignment of read-only location ‘*(const int*)p5‘
     (*p5) = &b;
           ^
J:\SITP\alg\main.cpp:26:11: error: invalid conversion from ‘int*‘ to ‘int‘ [-fpermissive]
J:\SITP\alg\main.cpp:27:8: error: assignment of read-only variable ‘p5‘
     p5 = &b;
        ^
mingw32-make.exe[3]: *** [CMakeFiles/alg.dir/main.cpp.obj] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/alg.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/alg.dir/rule] Error 2
CMakeFiles\alg.dir\build.make:61: recipe for target ‘CMakeFiles/alg.dir/main.cpp.obj‘ failed
CMakeFiles\Makefile2:66: recipe for target ‘CMakeFiles/alg.dir/all‘ failed
CMakeFiles\Makefile2:78: recipe for target ‘CMakeFiles/alg.dir/rule‘ failed
mingw32-make.exe: *** [alg] Error 2
Makefile:117: recipe for target ‘alg‘ failed

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

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

Process finished with exit code 0

原文地址:https://www.cnblogs.com/liutianchen/p/8716638.html

时间: 2024-10-14 23:52:39

特别没前途的C++ - explicit和volatile/const的内容的相关文章

封闭模式没前途?移动互联网行业将步入生态开放时代

日前,乐视网董事长贾跃亭在微博上发布的一封<致苹果的一封信:下一代移动互联网不再需要专制者>引发了无数网友的热议.在信中,贾跃亭表示,只有时代的模式,没有永恒的模式,封闭的苹果已不符合时代的发展趋势,必然会衰弱. 也许,贾跃亭的这封信得罪了不少果粉,不过刘旷却认为贾跃亭的这封信只是说了一番大实话,同时也表达了很多业内外人士共同的心声.不可否认,乔布斯凭借着封闭系统打造了极致用户体验的苹果产品,让很多果粉至今沉醉于此.但是越来越多的苹果用户却开始抱怨库克领导下的苹果系统.产品设计等缺乏创新,其实

C-static,auto,register,volatile,const

static 一:静态,意思就是呆在一个地方,不想动,大概就是编译期间就确定地址了.首先了解下C中的进程内存布局: 1)正文段(代码段)——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里. 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量:内核将此段初始化为0. 4)栈——增长方向:自顶向下增长:自动变量以及每次函数调用时所需要保存的信息(返回地址:环境信息). 5

新手小白学Python有前途吗?

最近开始整理python的资料,博主建立了一个qq群,希望给大家提供一个交流的同平台 78486745 . 很多同学在选择学习python之初,可能都有这样的疑惑:学Python有前途吗?对于新兴的事物,人们慢慢接受是需要一个过程的,那究竟学python有没有前途呢?今天小编就来给大家指导一下迷津. 首先从国家的层面上来说,国务院发布<新一代人工智能发展规划>,人工智能正式纳入国家发展战略,在教育上,教育部已将人工智能.物联网.大数据处理划入高中新课标;浙江省.北京市.山东省等将 Python

在嵌入式学习困惑:做驱动开发还是做应用开发更有前途

在嵌入式学习过程中,很多人都有这样的困惑! 意思就是说,"你告诉我哪个更有前途,我就好好学哪个,另外一个就不用学了".问这种问题的同事往往会同时问另外一些问题:我以后就想做驱动开发,你教我这些应用开发的技术有什么用?C++用得多吗?学了有什么用?我以后不想做GUI,你教我Qt有什么用? 学习最忌讳的就是"有用的就学,没有用的就不学"这种功利的态度.两个问题:第一,在你还没学进去.还不了解这种技术时,要如何判断这种技术学了有没有用?只能是根据道听途说,看各种论坛上都怎

宏定义的用法以及再次解释const和volatile

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

Java并发编程之volatile的理解

Java并发编程之volatile关键字的理解 Java中每个线程都有自己的工作内存,类比于处理器的缓存,线程的工作内存中保存了被该线程使用到的变量的主内存的拷贝.线程读写变量都是直接在自己的工作内存中进行的,而何时刷新数据(指将修改的结果更新到主存或者把主存的变量读取覆盖掉工作内存中的值)是不确定的. volatile关键字是修饰字段的关键字,貌似是JDK1.5之后才有的,在多线程编程中,很大的几率会用到这个关键字,volatile修饰变量后该变量有这么一种效果:线程每一次读该变量都是直接从主

【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解

Register 用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器 中:但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出 选择是否放在自己的寄存器中:不过其它与register关键字有关的其它符号都对32位编译 器有效. Const 被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性. 它可以修饰函数的参数.返回值,甚至函数的定义体.(特别注意,在C语言中,const修 饰的变量本质依旧

C/C++中的volatile简单描述

首先引入一篇博客: 1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明: A volatile specifier is a hint to a compiler that an object may change its value in ways not s

STM32库中 __IO 修饰符(volatile修饰符)

STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下 /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus #define   __I     volatile