此文僅參考陳正衝老師所寫c 語言標準定義的 32 個關鍵字
關鍵字 意 義
auto 宣告自動變數,預設時編譯器一般預設為 auto
int 宣告整型變數
double 宣告雙精度變數
long 宣告長整型變數
char 宣告字元型變數
float 宣告浮點型變數
short 宣告短整型變數
signed 宣告有符號型別變數
unsigned 宣告無符號型別變數
struct 宣告結構體變數
union 宣告聯合資料型別
enum 宣告列舉型別
static 宣告靜態變數
switch 用於開關語句
case 開關語句分支
default 開關語句中的「其他」分支
break 跳出當前迴圈
register 宣告暫存器變數
const 宣告唯讀變數
volatile 說明變數在程式執行中可被隱含地改變
typedef 用以給資料型別取別名(當然還有其他作用)
c99標準
一、定義和宣告的區別
int i
extern int i
1.定義的定義:所謂定義就是建立乙個物件,並為這個物件分配一塊記憶體給它並取乙個名字(變數名) 這個名字一旦和記憶體匹配起來,他們就不離不棄,這塊記憶體的位置不能被改變,當乙個變數或物件在一定區域內(比如函式或者全域性)只能被定義一次,多次定義,編譯器會提示你重複定義同乙個變數或者物件。
2.什麼是宣告:有兩重含義,如下:
第一重含義:告訴編譯器,這個名字已經匹配到一塊記憶體上了,下面的**用到變數或物件是在別的地方定義的。宣告可以出現多次。
第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變數
名或物件名。比如你在圖書館自習室的某個座位上放了一本書,表明這個座位已經有人預
訂,別人再也不允許使用這個座位。其實這個時候你本人並沒有坐在這個座位上。這種聲
明最典型的例子就是函式引數的宣告,例如:
void fun(int i, char c)
二、一些知識點
auto 編譯器在預設的預設情況下,所有變數都是auto
register 請求編譯器盡可能將變數存在cpu內部而不是通過記憶體訪問以提高效率,是盡可能,因為如果你定義太多此類變數,太累了,根本輪不到。
暫存器:
在不考慮cpu快取記憶體區情況下,資料從記憶體裡拿出來放到暫存器裡,然後cpu再從暫存器裡讀取資料來處理,處理後同樣通過暫存器把資料放到記憶體裡,cpu不直接和記憶體打交道。為什麼要如此呢,主要是考慮速度,暫存器其實就是一塊塊小的儲存空間,只不過其訪問記憶體要比記憶體開跌多,比在那麼大的一塊記憶體裡去尋找某個位址上的資料快的多。
雖然暫存器的速度非常快,但是使用 register 修飾符也有些限制的:register 變數必須是能被 cpu 暫存器所接受的型別。意味著 register 變數必須是乙個單個的值,並且其長度應小於或等於整型的長度。 而且 register 變數可能不存放在記憶體中,所以不能用取址運算子「&」來獲取 register 變數的位址
static
void example()
第乙個程式多次呼叫結果 0 0 0 0 0 0 0 0
void example()
第二個程式多次呼叫結果 0 1 2 3 4 5 6
三、基本資料型別
當你定義了不同的型別的資料的時候同時也確定了你資料的大小,就類似於乙個不同的口徑模具,喀喀喀,出來了幾個不同大小的型別變數供你使用。
四、變數命名的規則
一般規則:
【規則 1-1】命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。識別符號最好採用英文單詞或其組合,不允許使用拼音。程式中的英文單詞一般不要太複雜,用詞應當準確。
【規則 1-2】命名的長度應當符合「min-length && max-information」原則。c 是一種簡潔的語言, 命名也應該是簡潔的。例如變數名 maxval 就比maxvalueuntiloverflow 好用。識別符號的長度一般不要過長,較長的單詞可通過去掉「母音」形成縮寫。另外,英文詞盡量不縮寫,特別是非常用專業名詞,如果有縮寫,在同一系統中對同一單詞必須使用相同的表示法,並且註明其意思。
【規則 1-3】當識別符號由多個詞組成時,每個詞的第乙個字母大寫,其餘全部小寫。比如:int currentval;這樣的名字看起來比較清晰,遠比一長串字元好得多。
【規則 1-4】盡量避免名字**現數字編號,如 value1,value2 等,除非邏輯上的確需要編號。比如驅動開發時為管腳命名,非編號名字反而不好
【規則 1-5】對在多個檔案之間共同使用的全域性變數或函式要加範圍限定符(建議使用模組名(縮寫)作為範圍限定符)。(gui_ ,etc)識別符號的命名規則:
【規則 1-6】識別符號名分為兩部分:規範識別符號字首(字尾) + 含義標識 。非全域性變數可以不用使用範圍限定符字首。
【規則 1-10】程式中不得出現僅靠大小寫區分的相似的識別符號。
例如:intx, x; 變數 x 與 x 容易混淆
void foo(intx); 函式 foo 與 foo 容易混淆
void foo(floatx);
這裡還有乙個要特別注意的就是 1(數字 1)和 l(小寫字母 l)之間,0(數字 0)和 o
(小寫字母 o)之間的區別。這兩對真是很難區分的
【規則 1-11】乙個函式名禁止被用於其它之處。
例如:
#include "c_standards.h"
void foo(intp_1)
void static_p(void)
【規則 1-12】所有巨集定義、列舉常數、唯讀變數全用大寫字母命名,用下劃線分割單詞。
例如:const int max_length = 100; //這不是常量,而是乙個唯讀變數,具體請往後看
#define file_path 「/usr/tmp」
【規則 1-13】考慮到習慣性問題,區域性變數中可採用通用的命名方式,僅限於 n、i、j 等作
為迴圈變數使用。
一定不要寫出如下這樣的**:
int p;
char i;
int c;
char * a;
一般來說習慣上用 n,m,i,j,k 等表示 int 型別的變數;c,ch 等表示字元型別變數;a 等表
示陣列;p 等表示指標。當然這僅僅是一般習慣,除了 i,j,k 等可以用來表示迴圈變數外,別
的字元變數名盡量不要使用。
【規則 1-14】定義變數的同時千萬千萬別忘了初始化。定義變數時編譯器並不一定清空了
這塊記憶體,它的值可能是無效的資料。
這個問題在記憶體管理那章有非常詳細的討論,請參看。
【規則 1-15】不同型別資料之間的運算要注意精度擴充套件問題,一般低精度資料將向高精度
資料擴充套件。
tips
case 後面只能是整型或字元型的常量或常量表示式(想想字元型資料在記憶體裡
是怎麼存的)。
break 關鍵字很重要,表示終止 本層迴圈。現在這個例子只有一層迴圈,當**執行到
break 時,迴圈便終止。如果把 break 換成 continue 會是什麼樣子呢?continue 表示終止 本次(本輪)迴圈。當**執行到 continue 時,本輪迴圈終止,進入下一輪迴圈。while(1)也有寫成 while(true) 或者while(1==1) 或者 while((bool) 1)等形式的,效果一樣。do-while 迴圈:先執行 do 後面的**,然後再判斷 while 後面括號裡的值,如果為真,迴圈開始;否則,迴圈不開始。其用法與 while 迴圈沒有區別,但相對較少用。for 迴圈:for 迴圈可以很容易的控制迴圈次數,多用於事先知道迴圈次數的情況下。
在 c 語言中,const 修飾的 max 仍然是變數,只不過是唯讀屬性罷了;而在 c++裡,擴充套件了 const 的含義,這裡就不討論了。注意:const 修飾的唯讀變數必須在定義的同時初始化
編譯器通常不為普通 const 唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。
例如:#define m 3 //巨集常量
constintn=5; //此時並未將 n 放入記憶體中
…inti=n; //此時為 n 分配記憶體,以後不再分配!
inti=m; //預編譯期間進行巨集替換,分配記憶體
intj=n; //沒有記憶體分配
intj=m; //再進行巨集替換,又一次分配記憶體!
const 定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const 定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define 定義的巨集常量在記憶體中有若干個拷貝。#define 巨集是在預編譯階段進行替換,而 const 修飾的唯讀變數是在編譯的時候確定其值。#define 巨集沒有型別,而 const 修飾的唯讀變數具有特定的型別。
c 關鍵字mutable深入解析
1 關於mutable關鍵字 先說用法,mutable關鍵字只能修飾非靜態以及非常量成員變數,使用muwww.cppcns.comtable修www.cppcns.com飾的成員變數在const函式中的值是可以修改的。比如說下面的 複製 如下 class de程式設計客棧mo demo public...
C語言關鍵字解析
c語言關鍵字解析 c語言關鍵字有32個,如表1所示。雖然簡單,但還是讓一些初學者犯錯,譬如sizeof,好多初學者都認為是函式,其中包括我的一些同學,他們學過有好多年了,如此看來,有時我們追求高深的內容,往往會忽略基礎的簡單的內容!表1 c語言標準定義的 32個關鍵字 關鍵字 意義 auto 宣告自...
C語言static關鍵字解析
1 概述 static 宣告的變數在c語言中有兩方面的特徵 1 變數會被放在程式的全域性儲存區中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。2 變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。2 問題 static...