• STM32笔试题笔记


      1. 一个变量既可以定义为const也可以定义为volatile(√)
    例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
    
    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
    精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
    
    volatile修饰符告诉complier变量值可以以任何不被程序明确指明的方式改变,最常见的例子就是外部端口的值,
    它的变化可以不用程序内的任何赋值语句就有可能改变的,这种变量就可以用volatile来修饰,complier不会优化掉它。
    
    const修饰的变量在程序里面是不能改变的,但是可以被程序外的东西修改,就象上面说的外部端口的值,
    如果仅仅使用const,有可能编译器会优化掉这些变量,加上volatile就万无一失了。
    
    • 2.register static int i = 0;(×)
    #include <stdio.h>
    
    int main (void)
    {
    	register static int i = 0;
    	
    	printf ("%d
    ", i);
    	
    	return 0;
    }
    

    报错如下:

    error: multiple storage classes in declaration of `i'
    error: invalid register name for 'i'
    

    -->声明“ i”时有多个存储类
    register和static关键字如下解释:

    register修饰的变量,将该变量尽可能存放在CPU中的寄存器中。可省去CPU从内存抓取数据的时间,提高了运行效率。
    register使用时注意事项:
    (1):只能修饰局部变量,不能修饰全局变量。不能修饰函数。
    (2):不能取这个变量的地址。(register修饰的变量,是将变量保存在CPU的寄存器中,而不在内存中,只有内存中才能取地址)
    (3):只能修饰CPU能接收的数据类型。意味着寄存器变量是一单个变量,变量长度应该小于寄存器长度。
    
    static修饰的变量存储在内存中全局数据区中的静态区;修饰局部变量,延长局部变量的生命周期,生命周期直到整个程序执行结束,
    但是不改变局部变量的作用域。修饰全局变量和函数,改变全局变量和函数的作用域。
    static的作用:
    (1):修饰全局变量,该变量只能被本文件调用,不能被别的文件调用。
    (2):修饰函数,这个函数只能被本文件内被其他函数调用,不能被别的文件调用。
    

    总结:register和static不能一起使用修饰一个变量,相当于定义了一个变量在两个区域(内存和CPU寄存器中)

  • 相关阅读:
    [k8s微服务作业]-day2-Docker基础
    运维常用命令记录
    【莫比乌斯反演】学习笔记
    2021牛客OI赛前集训营-提高组(第一场)
    NOIP 计划 · 模拟赛 #10
    2021牛客OI赛前集训营-提高组(第二场)
    10.5 模拟赛题解报告
    组合数学
    线段树合并
    2021, 9,26 模拟赛
  • 原文地址:https://www.cnblogs.com/risesource/p/12057119.html
Copyright © 2020-2023  润新知