-
- 一個變量既可以定義為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\n", 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寄存器中)