C語(yǔ)言變量
變量的本質(zhì)
變量的本質(zhì)其實(shí)是程序可操作的存儲(chǔ)區(qū)的名稱(chēng)虱歪。
C 中每個(gè)變量都有特定的類(lèi)型时迫,類(lèi)型決定了變量存儲(chǔ)的大小的范圍娇昙,在范圍內(nèi)的值都可以存儲(chǔ)在內(nèi)存中净刮,運(yùn)算符可應(yīng)用于變量上剥哑。
變量的名稱(chēng)可以由字母、數(shù)字和下劃線字符組成淹父。它必須以字母或下劃線開(kāi)頭株婴。大寫(xiě)字母和小寫(xiě)字母是不同的,因?yàn)?C 是大小寫(xiě)敏感的暑认。以下是幾種基本的變量類(lèi)型:
類(lèi)型 | 描述 |
---|---|
char | 通常是一個(gè)字節(jié)(八位)困介。是一個(gè)整數(shù)類(lèi)型。 |
int | 對(duì)機(jī)器而言蘸际,整數(shù)的最自然的大小座哩。 |
float | 單精度浮點(diǎn)值。單精度的格式粮彤,共32位:由1位符號(hào)根穷、8位指數(shù)、23位小數(shù)組成驾诈。 |
double | 雙精度浮點(diǎn)值缠诅。雙精度共64位:由1位符號(hào)溶浴、11位指數(shù)乍迄、52位小數(shù)組成 |
void | 表示類(lèi)型的缺失。 |
C 語(yǔ)言也允許定義各種其他類(lèi)型的變量士败,比如枚舉闯两、指針、數(shù)組谅将、結(jié)構(gòu)漾狼、共用體等等,先學(xué)習(xí)基本變量類(lèi)型饥臂。
C 中的變量定義
變量定義的本質(zhì)其實(shí)是告知編譯器在何處創(chuàng)建變量的存儲(chǔ)逊躁,以及如何創(chuàng)建變量的存儲(chǔ)(where & how?)隅熙。變量定義指定一個(gè)數(shù)據(jù)類(lèi)型稽煤,并包含了該類(lèi)型的一個(gè)或多個(gè)變量的列表核芽,如下所示:
type variable_list
type 必須是一個(gè)有效的 C 數(shù)據(jù)類(lèi)型,可以是 char酵熙、w_char轧简、int、float匾二、double 或任何用戶(hù)自定義的對(duì)象(對(duì)象本質(zhì)也是一種數(shù)據(jù)類(lèi)型)哮独,variable_list 可以由一個(gè)或多個(gè)標(biāo)識(shí)符名稱(chēng)組成,多個(gè)標(biāo)識(shí)符之間用逗號(hào)分隔察藐。如下列出一些有效的聲明的例子:
int i, j, k;
char c, ch;
float f, salary;
double d;
行 int i, j, k; 聲明并定義了變量 i皮璧、j 和 k,這指示編譯器創(chuàng)建類(lèi)型為 int 的名為 i转培、j恶导、k 的變量。
變量可以在聲明的時(shí)候被初始化(即:指定一個(gè)初始值)浸须〔沂伲“初始化器”由一個(gè)等號(hào),后跟一個(gè)常量表達(dá)式組成删窒,如下所示:
type variable_name = value;
列舉一些實(shí)例:
extern int a = 1, b = 2; // a 和 b 的聲明與初始化
int c = 3, d = 5; // 定義并初始化 c 和 d
byte x = 22; // 定義并初始化 x
char y = 'y'; // 變量 y 的值為 'y'
不帶初始化的定義:帶有靜態(tài)存儲(chǔ)持續(xù)時(shí)間的變量會(huì)被隱式初始化為 NULL(所有字節(jié)的值都是 0)裂垦,其他所有變量的初始值是未定義的。
C 中的變量聲明
變量聲明向編譯器保證變量以指定的類(lèi)型和名稱(chēng)存在肌索,這樣編譯器在不需要知道變量完整細(xì)節(jié)的情況下也能繼續(xù)進(jìn)一步的編譯蕉拢。變量聲明只在編譯時(shí)有它的意義,在程序連接時(shí)(程序運(yùn)行時(shí)诚亚?)編譯器需要實(shí)際的變量聲明晕换。
變量的聲明有兩種情況:
1、一種是需要建立存儲(chǔ)空間的站宗。例如:int a 在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間闸准。
2、另一種是不需要建立存儲(chǔ)空間的梢灭,通過(guò)使用extern關(guān)鍵字聲明變量名而不定義它夷家。 例如:extern int a 其中變量 a 可以在別的文件中定義的。
除非有extern關(guān)鍵字敏释,否則都是變量的定義库快。
聲明和定義的代碼示例
extern int i; //聲明,不是定義
int i; //聲明钥顽,也是定義
實(shí)例
嘗試下面的實(shí)例义屏,其中,變量在頭部就已經(jīng)被聲明過(guò)了,但是定義與初始化在主函數(shù)內(nèi):
#include <stdio.h>
// 在函數(shù)的外部定義變量a和b
int a;
int b;
int addNum(){
// 函數(shù)內(nèi)聲明變量a和b為外部變量
extern int x;
extern int y;
// 給外部變量(全局變量)a和b賦值
a = 1;
b = 2;
return a+b;
}
int main(){
int result;
// 調(diào)用函數(shù)addNum
result = addNum();
printf("result 為:d%",result);
return 0;
}
編譯并執(zhí)行上面代碼闽铐,結(jié)果如下:
result 為: 3
如果需要在一個(gè)源文件中引用另外一個(gè)源文件中定義的變量膀曾,只需在引用的文件中將變量加上 extern 關(guān)鍵字的聲明即可。
addNum.c 文件代碼
#include <stdio.h>
/*外部變量聲明*/
extern int x;
extern int y;
int addNum(){
return x + y;
}
test.c文件代碼
#include <stdio.h>
/*定義兩個(gè)全局變量*/
int x = 1;
int y = 2;
int addNum();
int main(void){
int retult;
result = addNum();
printf("result 為:d% \n",result);
return 0;
}
編譯并執(zhí)行上面代碼阳啥,結(jié)果如下:
result 為: 3
C語(yǔ)言中的左值(Lvalues)和右值(Rvalues)
這個(gè)概念可能跟我個(gè)人的水平有限很菜有關(guān)添谊,覺(jué)得沒(méi)什么用,像是繞口令察迟,看看了解下就好
C 中有兩種類(lèi)型的表達(dá)式:
1斩狱、左值(lvalue):指向內(nèi)存位置的表達(dá)式被稱(chēng)為左值(lvalue)表達(dá)式。左值可以出現(xiàn)在賦值號(hào)的左邊或右邊扎瓶。
2所踊、右值(rvalue):術(shù)語(yǔ)右值(rvalue)指的是存儲(chǔ)在內(nèi)存中某些地址的數(shù)值。右值是不能對(duì)其進(jìn)行賦值的表達(dá)式概荷,也就是說(shuō)秕岛,右值只能出現(xiàn)在賦值號(hào)的右邊,但不能出現(xiàn)在賦值號(hào)的左邊误证。
變量是左值继薛,因此可以出現(xiàn)在賦值號(hào)的左邊。數(shù)值型的字面值是右值愈捅,因此不能被賦值遏考,不能出現(xiàn)在賦值號(hào)的左邊。下面是一個(gè)有效的語(yǔ)句:
int g = 20;//左值被賦值
但是下面這個(gè)就不是一個(gè)有效的語(yǔ)句蓝谨,會(huì)生成編譯時(shí)錯(cuò)誤:
10 = 20;//右值10不能出現(xiàn)在賦值號(hào)的右邊