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寄存器中)

原文地址:https://www.cnblogs.com/risesource/p/12057119.html