C 語言基礎(chǔ)之C語言的常見關(guān)鍵字
首先我們簡單的和這些關(guān)鍵字見見面(被高亮的關(guān)鍵字是今天要介紹的)
這其中有大家熟知的數(shù)據(jù)類型:int
,char
,float
,double
…
也有控制語句用到的:if
,for
,do
…
還有一些就是今天主要介紹的關(guān)鍵字。
至于還有一些新增的關(guān)鍵字,以上表格未曾提到,大家如果想去了解,可自行查找。
個(gè)別術(shù)語介紹(可先跳過,后文如若遇到不懂,可回來了解)
自動(dòng)變量:指的是局部作用域變量,具體來說即是在控制流進(jìn)入變量作用域時(shí)系統(tǒng)自動(dòng)為其分配存空間, 并在離開作用域時(shí)釋放空間的一類變量
存儲(chǔ)類:是C語言與C++語言的標(biāo)準(zhǔn)中,變量與函數(shù)的可訪問性(即作用域范圍)與生存期
寄存器:寄存器是CPU內(nèi)部用來存放數(shù)據(jù)的一些小型存儲(chǔ)區(qū)域,用來暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果。
計(jì)算機(jī)中的數(shù)據(jù)可以存儲(chǔ)到:寄存器,高速緩存器,內(nèi)存,硬盤,網(wǎng)盤
(以上存儲(chǔ)從左到右按照,內(nèi)存越來越大,造假越來越低,傳輸速度越來越慢排序)
1、auto
auto:聲明自動(dòng)變量,一般都省略
默認(rèn)情況下,在代碼塊內(nèi)聲明的變量都是自動(dòng)變量,但亦可用自動(dòng)變量的關(guān)鍵字auto明確標(biāo)識存儲(chǔ)類
代碼如下:
int a=0; //上下兩個(gè)變量其實(shí)相同,只不過上面省略了auto auto int a=0;
2、register
register:聲明寄存器變量
這個(gè)關(guān)鍵字定義變量后,會(huì)請求編譯器盡可能的將變量存在CPU內(nèi)部寄存器中,而不是通過內(nèi)存尋 址訪問,以提高效率。(因?yàn)榧拇嫫骱苄。绻x了很多register變量,可能會(huì)超過CPU的寄存 器個(gè)數(shù),超過容量,故變量不是一定會(huì)存入寄存器內(nèi))
3、signed和unsigned
signed:有符號的(一般定義常量默認(rèn)為signed)-------可以存儲(chǔ)正數(shù)和負(fù)數(shù)
unsigned:無符號的-----不能存儲(chǔ)負(fù)數(shù)
signed int a=10; //一般默認(rèn)為signed,故只要寫成:int a=10; unsigned float=-75.3------>錯(cuò)誤定義 float=-75.3------>正確定義 signed float=-75.3------->正確定義
4、typedef
typedef:類型重定義-------一般對于太過復(fù)雜的數(shù)據(jù)類型,可以重新定義一個(gè)簡單的或有辨識度的使用
typedef <數(shù)據(jù)類型> <你取的類型名>
unsigned long int a=10; //數(shù)據(jù)類型過于復(fù)雜,可以使用typedef重新定義 typedef unsigned long int u_l_int; u_l_int a=10; //與unsigned long int a=10等價(jià)
5、extern
extern:用在變量或者函數(shù)的聲明前,用來說此變量/函數(shù)是在別處定義的,要在此處引用
默認(rèn)情況下全局變量只能在定義它的文件中使用(從定義該全局變量開始到所在文件的文件尾), 但如果在另一個(gè)文件中將這個(gè)變量聲明為外部變量,那么這個(gè)變量的作用域?qū)⒈粩U(kuò)展到另外一個(gè)文 件中。
代碼如下:
先在源文件中創(chuàng)建項(xiàng)目名為:main.c
#inlcude <stdio.h> extern int a; extern int Add(int x,int y); int main() { printf("%d\n",a); printf("%d\n",Add(3,2)); }
再在源文件中創(chuàng)建項(xiàng)目名為:test.c-------作為全局變量
,函數(shù)定義的文件
int a=10;//全局變量 int Add(int x,int y)// { return x+y;//函數(shù)定義 }
結(jié)果會(huì)輸出10,5
6、拓展
變量的聲明有兩種情況
- 一種是需要建立存儲(chǔ)空間的。例如:int a 在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間。
- 另一種是不需要建立存儲(chǔ)空間的,通過使用extern關(guān)鍵字聲明變量名而不定義它。
例如:
extern int a
其中變量 a 可以在別的文件中定義的。
extern int i;
//聲明,不是定義
int i;
//聲明,也是定義定義分配存儲(chǔ)空間,而聲明不會(huì)
如何區(qū)分聲明還是變量
extern
告訴編譯器變量在其他地方定義了
如果聲明有初始化式,就被當(dāng)作定義,即使前面加了extern
函數(shù)的聲明和定義區(qū)別比較簡單,帶有{ }的就是定義,否則就是聲明
沒有extern
關(guān)鍵字的都是變量的定義
static:
static:聲明靜態(tài)變量
- 修飾局部變量 使其生命周期變長(本質(zhì)上改變了變量的存儲(chǔ)類型)
- 修飾全局變量 改變了全局變量的作用域,讓靜態(tài)的全局變量只能在自己的源文件內(nèi)使用全局變量在其他源文件內(nèi)部可以被使用,是因?yàn)槿肿兞烤哂型獠挎溄訉傩浴5潜籹tatic修飾后,就變成了內(nèi)部鏈接屬性,其他源文件就不能鏈接到這個(gè)靜態(tài)的全局變量
- 修飾函數(shù) 改變了函數(shù)的鏈接屬性,將函數(shù)的外部鏈接屬性變成了內(nèi)部鏈接屬性,使得函數(shù)只能在自己所在的源文件內(nèi)部使用
解釋1,代碼如下:
#include <stdio.h> void Add(int x) { static int a=2; a++; printf("%d ",x+a); } int main() { int i=0; for(i=0;i<3;i++) { Add(1); } return 0; }
結(jié)果是4 5 6
,大家知道int a=2
是一個(gè)自動(dòng)變量,在他作用域結(jié)束后,空間就會(huì)釋放掉,a的值不能保存。
而加上static改變了他的生命周期,使他在整個(gè)項(xiàng)目結(jié)束前的一直存在,所以a的值會(huì)不斷迭代
解釋2,3,代碼如下:(引用extern的內(nèi)容,大家可以自行對比)
先在源文件中創(chuàng)建項(xiàng)目名為:main.c
##inlcude <stdio.h> extern int a; extern int Add(int x,int y); int main() { printf("%d\n",a); printf("%d\n",Add(3,2)); }
再在源文件中創(chuàng)建項(xiàng)目名為:test.c-------作為全局變量,函數(shù)定義的文件
static int a=10;//全局變量 static int Add(int x,int y) { return x+y;//函數(shù)定義 }
產(chǎn)生結(jié)果如下:
最后注意:#define和#include不是關(guān)鍵字,是預(yù)處理指令
到此這篇關(guān)于C 語言基礎(chǔ)之C語言的常見關(guān)鍵字的文章就介紹到這了,更多相關(guān)C語言的常見關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下用Valgrind做檢查(防止內(nèi)存泄露)
Valgrind是一款基于模擬linux下的程序調(diào)試器和剖析器的軟件套件,可以運(yùn)行于x86, amd64和ppc32架構(gòu)上。valgrind包含一個(gè)核心,它提供一個(gè)虛擬的CPU運(yùn)行程序,還有一系列的工具,它們完成調(diào)試,剖析和一些類似的任務(wù)2014-01-01Qt一個(gè)進(jìn)程運(yùn)行另一個(gè)進(jìn)程的實(shí)現(xiàn)方法
本文主要介紹了Qt一個(gè)進(jìn)程運(yùn)行另一個(gè)進(jìn)程的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04C語言 數(shù)據(jù)結(jié)構(gòu)中棧的實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)中棧的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10C++實(shí)現(xiàn) 單例模式實(shí)例詳解
這篇文章主要介紹了C++實(shí)現(xiàn) 單例模式實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05C++?protobuf中對不同消息內(nèi)容進(jìn)行賦值的方式總結(jié)(set_、set_allocated_、mutable_、
這篇文章主要給大家介紹了關(guān)于C++?protobuf中對不同消息內(nèi)容進(jìn)行賦值的方式總結(jié),主要使用的是set_、set_allocated_、mutable_、add_,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較
簡單的說const關(guān)鍵字修飾的變量具有常屬性,也就是說它所修飾的變量不能被修改,下文給大家介紹C/C++中const關(guān)鍵字的用法及其與宏常量的比較,需要的朋友可以參考下2017-07-07OpenCV reshape函數(shù)實(shí)現(xiàn)矩陣元素序列化
reshape函數(shù)是OpenCV中一個(gè)很有用的函數(shù),不僅可以改變矩陣的通道數(shù),還可以對矩陣元素進(jìn)行序列化。本文將主要介紹如何通過reshape實(shí)現(xiàn)矩陣元素序列化,需要的小伙伴可以參考一下2021-12-12