序
前一篇快速地瀏覽了幾種常見的功能,不過對于真正理解其中的概念來說,一篇文章是遠遠不夠的。因此,接下來的幾篇就詳細討論一下這些出現的概念。
因為主題是快速入門,所以著眼點還是在于實用性。這些介紹不會覆蓋所有的知識點,而是著力于使你有一個解決問題的思路,細節在需要的時候查查資料就好了。只要思路清晰了,編程就不再困難。那么,就讓正文開始吧!
變量以及它們的類型
變量這個概念,如果用比喻的方式來說明就會很好理解。
一個變量,就相當于一個盒子,里面存放了數字。對于這個盒子,我們可以把數字取出來查看,也可以把舊數字丟掉,換成新的數字。因為盒子里的數字可以修改,所以它就是一個變化的量,簡稱變量。
為了存放不同類型的數字,我們需要不同類型的盒子。在C語言中,最常用到的有以下幾種類型:
- 整數 int
- 單精度浮點數 float
- 雙精度浮點數 double
- 字符 char
- 布爾類型 bool
這些基本的變量,以及它們的組合,滿足了我們平時見到的絕大部分程序的需求。從快速入門的角度來說,熟悉這些就滿足了最低限度的要求。
首先,聲明變量!
聲明變量相當于創建出了一個盒子,給盒子取個名字,這是使用變量的第一步。像這樣:
int number; //聲明一個變量叫number
int x,y,z; //同時聲明多個變量
這樣就是一個int類型的變量。也可以在聲明時一起賦值,這叫做初始化(initialization),就是一開始就把一個數字放進盒子里。
int number = 0;
int x=1, y, z=3; //x為1,y未初始化,z為3
初始化是很推薦的,因為如果變量沒有初始化,它的值可能是任意的。如果沒有為它賦值,而是直接讀取了這個任意的初始值,程序會出現無法預料的運行結果。人難免會疏忽,所以為了避免自己的大意,初始化是一種保險的辦法。
float dog = 1.0f; //f 表明這個數字是float類型的,可以不加
double cat = 1.0; //沒有f結尾的小數,編譯器認為是double
char fish = 'A'; //字符的初始化就是用單引號加一個字符
bool isPig = false; //布爾類型只有true 或 false兩種值
字符是一種特殊的變量,雖然我們操作的時候用單引號和字符,但本質上它以數字的形式存儲在計算機中。另外,你可能會吐槽,這單個字符有什么用啊,至少也要能存單詞吧!嗯,你的直覺非常敏銳!這涉及到了字符串,另一個很重要的概念。
布爾類型是另一種特殊的變量,只有true或false兩個值,也就是“是”和“否”兩種情況。這在控制流中很有用。
字符和布爾類型我會在后續的文章中詳細介紹的,總之先來看這些簡單的數值變量吧!
開始計算!
有了盒子,我們可以對它做很多奇奇怪怪的事情。首先還是聲明:
int a, b = 0; // a未初始化,b初始化為0
之后為a賦值:
a = 1; //令a為1
a = a + 1; //讓a增加1
a ++; //讓a增加1的另一種寫法
a = b; //把b的值賦給a
a = 1.0; //???
這樣就能把想要的數字塞進盒子里,把舊的數字替換掉了。
語句的功能我在注釋中寫明了,不難理解。我相信你可以仿照這些語句,把數值修改為自己想要的結果。在最后一句中,我把double類型的值賦給了int類型的變量,你猜它會是什么結果呢?我先賣個關子,在本文的后半部分,你會找到答案。
輸出看看!
依然是出于實用性的考慮,我們要把數值打印出來,不然我們既沒辦法獲得計算結果,也沒辦法檢查計算得對不對,不是嗎?為了打印數字,我們用到printf函數。
這里插一句,printf指的是print format。print是打印,format 是格式化字符串的意思。這個函數接收字符串作為參數,把它打印在屏幕上。如果按照一定的格式來書寫這個字符串,我們就可以打印變量的值。
int a = 0;
printf("An integer: %d\n", a);
輸出結果:
An integer: 0
這里,printf接收了兩個參數,第一個是格式化的字符串,第二個是變量a。為了輸出整數類型,我們在字符串中需要放入數值的位置放入"%d",這叫做格式控制符。有了格式控制符,printf會在參數表中按順序搜索,發現了變量a,就把它的值打印在控制符對應的位置了?!癨n”表示換行符,它后面的文字會出現在下一行。
適用于不同類型的輸出控制符是不一樣的:
- 整數 %d
- 單精度浮點數 %f
- 雙精度浮點數 %lf
- 字符 %c
printf("Four types: %d %f %lf %c",5, 1.5f, 2.0, 'A');
這里直接把數值傳遞給了printf,這也是可以的。在這一句中,一共出現了4個控制符,printf會搜索4個變量,把它們的值打印在對應的位置。
類型轉換
既然都是數字,那么它們當然可以互相轉換,只是在轉換的過程中會發生信息的丟失。比如從浮點數3.14轉換到整數,結果是3,小數部分會丟失。
所以基本上,信息量double > float > int,轉換時盡量不要把信息量大的類型轉換到小的。
類型轉換的方法:
(1) 編譯器自動轉換:
int a = 5;
float b = 3.5f;
float c = a * b; //a被臨時轉換為float,與b的類型相匹配
在這里,編譯器會把a臨時變成float類型,然后計算出結果。這樣的臨時轉換不會改變a自己的值和類型。
int a = 0;
float b = 3.5f;
a = b;
這時,為了把b的值賦給a,編譯器把float類型轉換成了int。當然小數部分丟掉了,結果是3。反過來,如果是把int賦值給float,則不會發生信息的丟失。
(2) 手動轉換:
手動轉換的意義在于避免整數相除可能會造成的尷尬后果:
int a = 5;
int b = 10;
float c = a/b;
你猜結果是多少?0.0f。因為int類型之間發生的除法結果仍然是int類型,所以5/10取整之后變成了0。0被賦值給了float類型的c,就成了0.0f。為了糾正這種情況,要把代碼改成下面這樣:
int a = 5;
int b = 10;
float c = (float)a/b;
這里加了一個括號,就把a手動轉換為了float。為了與float類型的a計算,b會被自動轉換為float,因此最后得到0.5f。這樣的手動轉換也是臨時的,a本身不會受到影響。
寫到這里,你一定知道了前面的問題的答案了。???哪個問題?這個呀,這個:
int a;
a = 2.0;
a的值是多少,現在看來答案是很顯然的了,快寫個小程序驗證一下吧!
小練習
雖然這篇文章其實沒寫多少內容,但是考慮到寫太長了很難讀,先寫到這里好了。如果之后覺得不妥,還會調整篇幅,那么留下幾個小練習:
- 嘗試使用幾種類型變量,并且做些轉換
- 輸出幾種類型的變量的值
就到這里,我們下一篇再見啦~