日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言 —— 关键字(C语言标准定义的32个关键字:auto、register、static、sizeof、signed、unsigned 、break 、 continue 、void)

發(fā)布時(shí)間:2025/10/17 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 —— 关键字(C语言标准定义的32个关键字:auto、register、static、sizeof、signed、unsigned 、break 、 continue 、void) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言標(biāo)準(zhǔn)定義的32個(gè)關(guān)鍵字:(列出每個(gè)關(guān)鍵字的意義)

關(guān)鍵字 意 義
auto 聲明自動(dòng)變量,缺省時(shí)編譯器一般默認(rèn)為 auto
int 聲明整型變量
double 聲明雙精度變量
long 聲明長(zhǎng)整型變量
char 聲明字符型變量
float 聲明浮點(diǎn)型變量
short 聲明短整型變量
signed 聲明有符號(hào)類(lèi)型變量
unsigned 聲明無(wú)符號(hào)類(lèi)型變量
struct 聲明結(jié)構(gòu)體變量
union 聲明聯(lián)合數(shù)據(jù)類(lèi)型
enum 聲明枚舉類(lèi)型
static 聲明靜態(tài)變量
switch 用于開(kāi)關(guān)語(yǔ)句
case 開(kāi)關(guān)語(yǔ)句分支
default 開(kāi)關(guān)語(yǔ)句中的“其他”分支
break 跳出當(dāng)前循環(huán)
register 聲明寄存器變量
const 聲明只讀變量
volatile 說(shuō)明變量在程序執(zhí)行中可被隱含地改變
typedef 用以給數(shù)據(jù)類(lèi)型取別名(當(dāng)然還有其他作用
extern 聲明變量是在其他文件正聲明(也可以看做是引用變量)
return 子程序返回語(yǔ)句(可以帶參數(shù),也可不帶參數(shù))
void 聲明函數(shù)無(wú)返回值或無(wú)參數(shù),聲明空類(lèi)型指針
continue 結(jié)束當(dāng)前循環(huán),開(kāi)始下一輪循環(huán)
do 循環(huán)語(yǔ)句的循環(huán)體
while 循環(huán)語(yǔ)句的循環(huán)條件
if 條件語(yǔ)句
else 條件語(yǔ)句否定分支(與 if 連用)
for 一種循環(huán)語(yǔ)句(可意會(huì)不可言傳)
goto 無(wú)條件跳轉(zhuǎn)語(yǔ)句
sizeof 計(jì)算對(duì)象所占內(nèi)存空間大小


?

1.1,最寬恒大量的關(guān)鍵字----auto
auto:它很寬恒大量的,你就當(dāng)它不存在吧。編譯器在默認(rèn)的缺省情況下,所有變量
都是 auto 的。


1.2,最快的關(guān)鍵字---- register
register:這個(gè)關(guān)鍵字請(qǐng)求編譯器盡可能的將變量存在 CPU 內(nèi)部寄存器中而不是通過(guò)內(nèi)
存尋址訪問(wèn)以提高效率。注意是盡可能,不是絕對(duì)。你想想,一個(gè) CPU 的寄存器也就那么
幾個(gè)或幾十個(gè),你要是定義了很多很多 register 變量,它累死也可能不能全部把這些變量放
入寄存器吧,輪也可能輪不到你。
使用 register 修飾符的注意點(diǎn):雖然寄存器的速度非???#xff0c;但是使用 register 修飾符也有些限制的: register 變量必須是
能被 CPU 寄存器所接受的類(lèi)型。意味著 register 變量必須是一個(gè)單個(gè)的值,并且其長(zhǎng)度應(yīng)小
于或等于整型的長(zhǎng)度。 而且 register 變量可能不存放在內(nèi)存中, 所以不能用取址運(yùn)算符“ &”
來(lái)獲取 register 變量的地址。


1.3,最名不符實(shí)的關(guān)鍵字----static
不要誤以為關(guān)鍵字 static 很安靜,其實(shí)它一點(diǎn)也不安靜。這個(gè)關(guān)鍵字在 C 語(yǔ)言里主要有
兩個(gè)作用, C++對(duì)它進(jìn)行了擴(kuò)展
1.3.1,修飾變量
第一個(gè)作用:修飾變量。變量又分為局部和全局變量,但它們都存在內(nèi)存的靜態(tài)區(qū)。
靜態(tài)全局變量,作用域僅限于變量被定義的文件中,其他文件即使用 extern 聲明也沒(méi)法
使用他。準(zhǔn)確地說(shuō)作用域是從定義之處開(kāi)始,到文件結(jié)尾處結(jié)束,在定義之處前面的那些
代碼行也不能使用它。想要使用就得在前面再加 extern ***。惡心吧?要想不惡心,很簡(jiǎn)單,
直接在文件頂端定義不就得了。
靜態(tài)局部變量,在函數(shù)體里面定義的,就只能在這個(gè)函數(shù)里用了,同一個(gè)文檔中的其他
函數(shù)也用不了。由于被 static 修飾的變量總是存在內(nèi)存的靜態(tài)區(qū),所以即使這個(gè)函數(shù)運(yùn)行結(jié)
束,這個(gè)靜態(tài)變量的值還是不會(huì)被銷(xiāo)毀,函數(shù)下次使用時(shí)仍然能用到這個(gè)值。
static int j;
void fun1( void)
{
static inti = 0;
i ++;
}
void fun2( void)
{
j = 0;
j++;
}
intmain()
{
for(k=0; k<10; k++)
{
fun1();
fun2();
}
return 0;
}
i 和 j 的值分別是什么,為什么?(i會(huì)從1累加到10,就)
1.3.2,修飾函數(shù)
第二個(gè)作用:修飾函數(shù)。函數(shù)前加 static 使得函數(shù)成為靜態(tài)函數(shù)。但此處“static”的含義
不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域僅局限于本文件(所以又稱(chēng)內(nèi)部函數(shù))。使用內(nèi)部函
數(shù)的好處是:不同的人編寫(xiě)不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件
中的函數(shù)同名。
關(guān)鍵字 static 有著不尋常的歷史。起初,在 C 中引入關(guān)鍵字 static 是為了表示退出一個(gè)
塊后仍然存在的局部變量。隨后, static 在 C 中有了第二種含義:用來(lái)表示不能被其它文件
訪問(wèn)的全局變量和函數(shù)。為了避免引入新的關(guān)鍵字,所以仍使用 static 關(guān)鍵字來(lái)表示這第二
種含義。
當(dāng)然, C++里對(duì) static 賦予了第三個(gè)作用,這里先不討論,有興趣的可以找相關(guān)資料研
究。


1.4,基本數(shù)據(jù)類(lèi)型----short、int、 long、char、float、double
C 語(yǔ)言包含的數(shù)據(jù)類(lèi)型如下圖所示:
?

?一般來(lái)說(shuō)習(xí)慣上用 n,m,i,j,k 等表示 int 類(lèi)型的變量; c, ch 等表示字符類(lèi)型變量; a 等表
示數(shù)組; p 等表示指針。當(dāng)然這僅僅是一般習(xí)慣,除了 i,j,k 等可以用來(lái)表示循環(huán)變量外,別
的字符變量名盡量不要使用。


1.5,最冤枉的關(guān)鍵字----sizeof
sizeof 是關(guān)鍵字不是函數(shù),其實(shí)就算不知道它是否為 32 個(gè)關(guān)鍵字之一時(shí),我們也可以
借助編譯器確定它的身份??聪旅娴睦?#xff1a;
int i=0;
A),sizeof(int); B), sizeof(i); C), sizeof int; D), sizeof i;
毫無(wú)疑問(wèn), 32 位系統(tǒng)下 A), B)的值為 4。那 C)的呢? D)的呢?
在 32 位系統(tǒng)下,通過(guò) Visual C++6.0 或任意一編譯器調(diào)試,我們發(fā)現(xiàn) D)的結(jié)果也為 4。
咦? sizeof 后面的括號(hào)呢?沒(méi)有括號(hào)居然也行,那想想,函數(shù)名后面沒(méi)有括號(hào)行嗎?由此輕
易得出 sizeof 絕非函數(shù)。
好,再看 C)。編譯器怎么怎么提示出錯(cuò)呢?不是說(shuō) sizeof 是個(gè)關(guān)鍵字,其后面的括號(hào)
可以沒(méi)有么?那你想想 sizeof int 表示什么啊? int 前面加一個(gè)關(guān)鍵字?類(lèi)型擴(kuò)展?明顯不
正確,我們可以在 int 前加 unsigned, const 等關(guān)鍵字但不能加 sizeof。好,記住: sizeof 在
計(jì)算變量所占空間大小時(shí),括號(hào)可以省略,而計(jì)算類(lèi)型(模子)大小時(shí)不能省略。一般情況下,
咱也別偷這個(gè)懶,乖乖的寫(xiě)上括號(hào),繼續(xù)裝作一個(gè)“函數(shù)”,做一個(gè)“披著函數(shù)皮的關(guān)鍵字”。
做我的關(guān)鍵字,讓人家認(rèn)為是函數(shù)去吧。


1.6,signed、unsigned 關(guān)鍵字
我們知道計(jì)算機(jī)底層只認(rèn)識(shí) 0、 1.任何數(shù)據(jù)到了底層都會(huì)變計(jì)算轉(zhuǎn)換成 0、 1.那負(fù)數(shù)怎么
存儲(chǔ)呢?肯定這個(gè)“ -”號(hào)是無(wú)法存入內(nèi)存的,怎么辦?很好辦,做個(gè)標(biāo)記。把基本數(shù)據(jù)類(lèi)
型的最高位騰出來(lái),用來(lái)存符號(hào),同時(shí)約定如下:最高位如果是 1,表明這個(gè)數(shù)是負(fù)數(shù),其
值為除最高位以外的剩余位的值添上這個(gè)“ -”號(hào);如果最高位是 0,表明這個(gè)數(shù)是正數(shù),
其值為除最高位以外的剩余位的值。


1.7 break 與 continue 的區(qū)別
break 關(guān)鍵字很重要,表示終止本層循環(huán)。現(xiàn)在這個(gè)例子只有一層循環(huán),當(dāng)代碼執(zhí)行到
break 時(shí),循環(huán)便終止。
如果把 break 換成 continue 會(huì)是什么樣子呢? continue 表示終止本次(本輪) 循環(huán)。當(dāng)
代碼執(zhí)行到 continue 時(shí),本輪循環(huán)終止,進(jìn)入下一輪循環(huán)。
while( 1)也有寫(xiě)成 while(true) 或者 while(1==1) 或者 while((bool) 1)等形式的,效果一
樣。
do-while 循環(huán):先執(zhí)行 do 后面的代碼,然后再判斷 while 后面括號(hào)里的值,如果為真,
循環(huán)開(kāi)始;否則,循環(huán)不開(kāi)始。其用法與 while 循環(huán)沒(méi)有區(qū)別,但相對(duì)較少用。
for 循環(huán): for 循環(huán)可以很容易的控制循環(huán)次數(shù),多用于事先知道循環(huán)次數(shù)的情況下。


1.8,void 關(guān)鍵字
void 有什么好講的呢?如果你認(rèn)為沒(méi)有,那就沒(méi)有;但如果你認(rèn)為有,那就真的有。有點(diǎn)像“色即是空,空即是色”。
void 真正發(fā)揮的作用在于:
(1) 對(duì)函數(shù)返回的限定;? (2) 對(duì)函數(shù)參數(shù)的限定

眾所周知, 如果指針 p1 和 p2 的類(lèi)型相同, 那么我們可以直接在 p1 和 p2 間互相賦值;
如果 p1 和 p2 指向不同的數(shù)據(jù)類(lèi)型,則必須使用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符把賦值運(yùn)算符右邊的
指針類(lèi)型轉(zhuǎn)換為左邊指針的類(lèi)型。
例如:
float *p1;
int *p2;
p1 = p2;
其中 p1 = p2 語(yǔ)句會(huì)編譯出錯(cuò),提示“'=' : cannot convertfrom 'int *' to 'float *'”,必須改為:
p1 = (float *)p2;
而 void *則不同,任何類(lèi)型的指針都可以直接賦值給它,無(wú)需進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換:
void *p1;
int *p2;
p1 = p2;
但這并不意味著, void *也可以無(wú)需強(qiáng)制類(lèi)型轉(zhuǎn)換地賦給其它類(lèi)型的指針。因?yàn)椤翱疹?lèi)型”可
以包容“有類(lèi)型”,而“有類(lèi)型”則不能包容“空類(lèi)型”。比如,我們可以說(shuō)“男人和女人都是人”,
但不能說(shuō)“人是男人”或者“人是女人”。下面的語(yǔ)句編譯出錯(cuò):
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。
void 修飾函數(shù)返回值和參數(shù)
【規(guī)則 1-33】如果函數(shù)沒(méi)有返回值,那么應(yīng)聲明為 void 類(lèi)型
在 C 語(yǔ)言中,凡不加返回值類(lèi)型限定的函數(shù),就會(huì)被編譯器作為返回整型值處理。但
是許多程序員卻誤以為其為 void 類(lèi)型。例如:
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[]) //甚至很多人以為 main 函數(shù)無(wú)返回值
//或是為 void 型的
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
程序運(yùn)行的結(jié)果為輸出: 2 + 3 = 5
這說(shuō)明不加返回值說(shuō)明的函數(shù)的確為 int 函數(shù)。
因此,為了避免混亂,我們?cè)诰帉?xiě) C 程序時(shí),對(duì)于任何函數(shù)都必須一個(gè)不漏地指定其
類(lèi)型。如果函數(shù)沒(méi)有返回值,一定要聲明為 void 類(lèi)型。這既是程序良好可讀性的需要,也
是編程規(guī)范性的要求。另外,加上 void 類(lèi)型聲明后,也可以發(fā)揮代碼的“自注釋”作用。所
謂的代碼的“自注釋”即代碼能自己注釋自己。
【規(guī)則 1-34】如果函數(shù)無(wú)參數(shù),那么應(yīng)聲明其參數(shù)為 void
在 C++語(yǔ)言中聲明一個(gè)這樣的函數(shù):
int function(void)
{
return 1;
}
則進(jìn)行下面的調(diào)用是不合法的: function(2);
因?yàn)樵?C++中,函數(shù)參數(shù)為 void 的意思是這個(gè)函數(shù)不接受任何參數(shù)。
但是在 Turbo C 2.0 中編譯:
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
更多免費(fèi)資源:www.fishc.com
}
編譯正確且輸出 1,這說(shuō)明,在 C 語(yǔ)言中,可以給無(wú)參數(shù)的函數(shù)傳送任意類(lèi)型的參數(shù),
但是在 C++編譯器中編譯同樣的代碼則會(huì)出錯(cuò)。在 C++中,不能向無(wú)參數(shù)的函數(shù)傳送任何
參數(shù),出錯(cuò)提示“'fun' : function does not take 1 parameters”。
所以,無(wú)論在 C 還是 C++中,若函數(shù)不接受任何參數(shù),一定要指明參數(shù)為 void
void 指針
【規(guī)則 1-35】千萬(wàn)小心又小心使用 void 指針類(lèi)型。
按照 ANSI(American National Standards Institute)標(biāo)準(zhǔn),不能對(duì) void 指針進(jìn)行算法操作,
即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:錯(cuò)誤
pvoid += 1; //ANSI:錯(cuò)誤
ANSI 標(biāo)準(zhǔn)之所以這樣認(rèn)定,是因?yàn)樗鼒?jiān)持:進(jìn)行算法操作的指針必須是確定知道其指
向數(shù)據(jù)類(lèi)型大小的。也就是說(shuō)必須知道內(nèi)存目的地址的確切值。
例如:
int *pint;
pint++; //ANSI:正確
但是大名鼎鼎的 GNU(GNU's Not Unix 的遞歸縮寫(xiě))則不這么認(rèn)定,它指定 void *的算法
操作與 char *一致。因此下列語(yǔ)句在 GNU 編譯器中皆正確:
pvoid++; //GNU:正確
pvoid += 1; //GNU:正確
在實(shí)際的程序設(shè)計(jì)中,為符合 ANSI 標(biāo)準(zhǔn),并提高程序的可移植性,我們可以這樣編寫(xiě)
實(shí)現(xiàn)同樣功能的代碼:
void * pvoid;
(char *)pvoid++; //ANSI:正確; GNU:正確
(char *)pvoid += 1; //ANSI:錯(cuò)誤; GNU:正確
GNU 和 ANSI 還有一些區(qū)別,總體而言, GNU 較 ANSI 更“開(kāi)放”,提供了對(duì)更多語(yǔ)法
的支持。但是我們?cè)谡鎸?shí)設(shè)計(jì)時(shí),還是應(yīng)該盡可能地符合 ANSI 標(biāo)準(zhǔn)。
【規(guī)則 1-36】如果函數(shù)的參數(shù)可以是任意類(lèi)型指針,那么應(yīng)聲明其參數(shù)為 void *。
典型的如內(nèi)存操作函數(shù) memcpy 和 memset 的函數(shù)原型分別為:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
這樣,任何類(lèi)型的指針都可以傳入 memcpy 和 memset 中,這也真實(shí)地體現(xiàn)了內(nèi)存操作
函數(shù)的意義, 因?yàn)樗僮鞯膶?duì)象僅僅是一片內(nèi)存, 而不論這片內(nèi)存是什么類(lèi)型。如果 memcpy
和 memset 的參數(shù)類(lèi)型不是 void *,而是 char *,那才叫真的奇怪了!這樣的 memcpy 和 memset
明顯不是一個(gè)“純粹的,脫離低級(jí)趣味的”函數(shù)!
下面的代碼執(zhí)行正確:
例子: memset 接受任意類(lèi)型指針
int IntArray_a[100];
memset (IntArray_a, 0, 100*sizeof(int) ); //將 IntArray_a 清 0
例子: memcpy 接受任意類(lèi)型指針
int destIntArray_a[100], srcintarray_a[100];
//將 srcintarray_a 拷貝給 destIntArray_a
memcpy (destIntArray_a, srcintarray_a, 100*sizeof(int) );
有趣的是, memcpy 和 memset 函數(shù)返回的也是 void *類(lèi)型,標(biāo)準(zhǔn)庫(kù)函數(shù)的編寫(xiě)者都不是一
般人。


1.9,void 關(guān)鍵字

return 用來(lái)終止一個(gè)函數(shù)并返回其后面跟著的值。
return (Val); //此括號(hào)可以省略。但一般不省略,尤其在返回一個(gè)表達(dá)式的值時(shí)。
return 可以返回些什么東西呢?看下面例子:
char * Func(void)
{
char str[30];

return str;
}
str 屬于局部變量,位于棧內(nèi)存中,在 Func 結(jié)束的時(shí)候被釋放,所以返回 str 將導(dǎo)致錯(cuò)誤。


2.0,const?關(guān)鍵字

2.0.1,修飾一般變量
一般常量是指簡(jiǎn)單類(lèi)型的只讀變量。這種只讀變量在定義時(shí),修飾符 const 可以用在類(lèi)
型說(shuō)明符前,也可以用在類(lèi)型說(shuō)明符后。例如:
int const i=2; 或 const int i=2;
2.0.2,修飾數(shù)組
定義或說(shuō)明一個(gè)只讀數(shù)組可采用如下格式:
int const a[5]={1, 2, 3, 4, 5};或
const int a[5]={1, 2, 3, 4, 5};
2.0.3,修飾指針
先忽略類(lèi)型名(編譯器解析的時(shí)候也是忽略類(lèi)型名),我們看 const 離哪個(gè)近?!敖畼?br /> 臺(tái)先得月”,離誰(shuí)近就修飾誰(shuí)。
const int *p; //const 修飾*p,p 是指針, *p 是指針指向的對(duì)象,不可變
int const *p; //const 修飾*p,p 是指針, *p 是指針指向的對(duì)象,不可變
int *const p; //const 修飾 p, p 不可變, p 指向的對(duì)象可變
const int *const p; //前一個(gè) const 修飾*p,后一個(gè) const 修飾 p,指針 p 和 p 指向的對(duì)象
都不可變
2.0.4修飾函數(shù)的參數(shù)
const 修飾符也可以修飾函數(shù)的參數(shù),當(dāng)不希望這個(gè)參數(shù)值被函數(shù)體內(nèi)意外改變時(shí)使
用。例如:
void Fun(const int i);
告訴編譯器 i 在函數(shù)體中的不能改變,從而防止了使用者的一些無(wú)意的或錯(cuò)誤的修改。
2.0.5修飾函數(shù)的返回值
const 修飾符也可以修飾函數(shù)的返回值,返回值不可被改變。例如:
const int Fun (void);
在另一連接文件中引用 const 只讀變量:
extern const int i; //正確的聲明
extern const int j=10; //錯(cuò)誤!只讀變量的值不能改變。

參考書(shū)籍《C語(yǔ)言深度剖析》

總結(jié)

以上是生活随笔為你收集整理的C语言 —— 关键字(C语言标准定义的32个关键字:auto、register、static、sizeof、signed、unsigned 、break 、 continue 、void)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。