CPP變量定義:存儲類型、限定符、修飾符、類型、標識符、字面量

對於強類型編程語言,如C/C++,變量的聲明與定義怎是那樣複雜:

[StorageClass] [Qualifier] [Modifier] Type Identifier [= literal(or right value)] ;

extern const long double d = 314159E-5L; // 函數外

1 StorageClass 存儲類型

存儲類型關鍵字定義變量的存儲屬性。

主要關鍵字有:

auto, register, static, extern, mutable(C++)。

1.1 auto

auto 存儲類是所有局部變量默認的存儲類,可省略, 已廢棄。

1.2 register

我們知道,程序代碼需要加載到內存才可以運行。控制器通過訪問編址的內存單元中的代碼或數據,產生控制信號,控制運算器進行運算,寄存器存儲中間結果以及內存地址、標誌值等,而存儲在磁盤上的文件可以是輸入的數據源,也可以是輸出的存儲介質。在彙編層面,程序員可以將有限的一些數據安排存儲到寄存器,在C/C++,也可以建議編譯器將數據直接存儲到寄存器。

1.3 static

static可以定義變量的存儲屬性(延長至程序存續期),也可以定義變量的連接屬性(限制到文件域內,文件外不能訪問)。

如果是修飾局部變量為static,因為其作用域是局部作用域內,局部作用域小於文件作用域,所以是延長其存儲存續期到程序結束。

如果是修飾全局變量為static,因為全局變量的存續期本來就是達到程序結束,所以static的作用是限制其訪問範圍至本文件,在文件外禁止訪問。

static也可以修飾類的成員。

1.4 extern

通常,C/C++變量的聲明和定義是同時進行的,特殊情況是extern只是聲明,聲明此變量是定義在其他位置的全局變量。

此全局變量可以是文件外的位置,也可以是文件內的extern聲明後(但必須是全局變量,所以只能是函數外)。

<code>#include <iostream>
using namespace std;
extern int i;
void f(){
\tcout<}
int main()
{
\tf();\t
\tcout<}
int i = 3;
/<iostream>/<code>

1.5 mutable

mutable 說明符僅適用於類的對象。我們知道,如果類的成員函數不會改變對象的狀態,那麼這個成員函數一般會聲明成const的。但是,有些時候,我們需要在const的函數里面修改一些跟類狀態無關的數據成員,那麼這個數據成員就應該被mutalbe來修飾。

<code>class Test
{
private:
int a;
mutable int b;
public:

void func2() const
{
a++; // 編譯錯誤,不允許修改a
b++; // mutable修飾後允許修改
}
};/<code>

2 Qualifier 限定符

主要關鍵字有:

unsigned, signed, long, short。

修飾符 signed、unsigned、long 和 short 可應用於整型,signed 和 unsigned 可應用於字符型,long 可應用於雙精度型。

修飾符 signed 和 unsigned 也可以作為 long 或 short 修飾符的前綴。例如:unsigned long int。

C++ 允許使用速記符號來聲明無符號短整數或無符號長整數。您可以不寫 int,只寫單詞 unsigned short 或 unsigned long,int 是隱含的。

3 Modifier 修飾符

主要關鍵字有:

const, volitile, restrict(C99)。

3.1 const

const 類型的對象在程序執行期間不能被修改改變,稱為常量,所以只有一次賦值的機會,也就是在聲明和定義變量的時候。

3.2 volitile

通常情況下,程序當中的一些變量是會臨時存入寄存器當中的,編譯器為了最大化地追求效率,在連續訪問同一個變量時,便不去內存當中取這個數據,而會直接從寄存器當中將它讀出,如此來增加效率。而如果你將一個變量聲明為volitile就告訴編譯器該變量是容易發生變化的,也就是說從寄存器當中和內存當中取得的數據可能是不一致的,所以編譯器便不進行自動優化了,每次都老老實實從內存當中將數據取出。
往往在多線程當中,將一些共享的數據設為volitile,可以保證數據的正確性。

3.3 restrict

restrict只能用於指針,並且表明指針是訪問一個數據對象的唯一且初始的方式。告訴編譯器被restrict修飾的指針所指向的對象,只能通過這個指針或基於這個指針的其他指針進行操作,即限制訪問用restrict限制的指針指向的對象只能通過這個指針訪問,這對編譯器的優化很有好處。

void *memcpy( void * restrict dest ,const void * restrict src,sizi_t n) 這是一個很有用的內存複製函數,由於兩個參數都加了restrict限定,所以兩塊區域不能重疊,即 dest指針所指的區域,不能讓別的指針來修改,即src的指針不能修改. 相對應的別一個函數 memmove(void *dest,const void * src,size_t)則可以重疊。

4 VariableType 變量類型

主要關鍵字有:

int, char, bool, enum, float, double, union, struct, objcet。

5 Literal 字面量

可以使用的字面量有:

215u, 0xFeeL, 0213, 0x4b, 30ul, 314159E-5L, true, false, \\n, \\ooo, \\\\xhh . . ."hello, dear", "hello, \\dear", "hello, " "d" "ear"

-End-


分享到:


相關文章: