程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言入門經典(第5版)之編程初步

C語言入門經典(第5版)之編程初步

編輯:關於C語言

現在讀者一定很渴望編寫程序,讓計算機與外界進行實際的交互。我們不希望程序只能做打字員的工作,顯示包含在程序代碼中的固定信息。的確,編程的內涵遠不止此。理想情況下,我們應能從鍵盤上輸入數據,讓程序把它們存儲在某個地方,這會讓程序更具多樣性。程序可以訪問和處理這些數據,而且每次執行時,都可以處理不同的數據值。每次運行程序時輸入不同的信息正是整個編程業的關鍵。在程序中存儲數據項的地方是可以變化的,所以叫做變量(variable),而這正是本章的主題。

本章的主要內容:

● 內存的用法及變量的概念

● 在C中如何計算

● 變量的不同類型及其用途

● 強制類型轉換的概念及其使用場合

● 編寫一個程序,計算樹木的高度

2.1 計算機的內存

首先看看計算機如何存儲程序要處理的數據。為此,就要了解計算機的內存,在開始編寫第一個程序之前,先簡要介紹計算機的內存。

計算機執行程序時,組成程序的指令和程序所操作的數據都必須存儲到某個地方。這個地方就是機器的內存,也稱為主內存(main memory),或隨機訪問存儲器(Random Access Memory,RAM)。RAM是易失性存儲器。關閉PC後,RAM的內容就會丟失。PC把一個或多個磁盤驅動器作為其永久存儲器。要在程序結束執行後存儲起來的任何數據,都應打印出來或寫入磁盤,因為程序結束時,存儲在RAM中的結果就會丟失。

可以將計算機的RAM想象成一排井然有序的盒子。每個盒子都有兩個狀態:滿為l,空為0。因此每個盒子代表—個二進制數:0或1。計算機有時用真(true)和假(false)表示它們:1是真,0是假。每個盒子稱為—個位(bit),即二進制數(binary digit)的縮寫。

注意:

如果讀者不記得或從來沒學過二進制數,可參閱附錄A。但如果不明白這些內容,不用擔心,因為這裡的重點是計算機只能處理0與1,而不能直接處理十進制數。程序使用的所有數據(包括程序指令)都是由二進制數組成的。

為了方便起見,內存中的位以8個為—組,每組的8位稱為一個字節(byte)。為了使用字節的內容,每個字節用一個數字表示,第—個字節用0表示,第二個字節用1表示,直到計算機內存的最後—個字節。字節的這個標記稱為字節的地址(address)。因此,每個字節的地址都是唯一的。每棟房子都有一個唯一的街道地址。同樣,字節的地址唯—地表示計算機內存中的字節。

總之,內存的最小單位是位(bit),將8個位組合為一組,稱為字節(byte)。每個字節都有唯一的地址。字節地址從0開始。位只能是0或1,如圖2-1所示。

 

圖2-1 內存中的字節

計算機內存的常用單位是千字節(KB)、兆字節(MB)、千兆字節 (GB)。大型磁盤驅動器使用兆兆字節(TB)。這些單位的意義如下:

● 1KB是1 024字節。

● 1MB是1 024KB,也就是1 048 576字節。

● 1GB是1 024MB,也就是1 073 741 841字節。

● 1TB是1 024GB,也就是1 099 511 627 776字節。

如果PC有1GB的RAM,字節地址就是0~1 073 741 841。為什麼不使用更簡單的整數,例如千、百萬或億?因為從0到1023共1024個數字,而在二進制中,1023的10個位剛好全是l:11 1111 1111,它是一個非常方便的二進制數。1000是很好用的十進制數,但是在二進制的計算機裡就不再那麼方便了,它是111110 1000。因此以KB(1 024字節)為單位,是為了方便計算機使用。同樣,MB需要20個位,GB需要30個位。

但是硬盤的容量可能出現混亂。磁盤制造商常常宣稱他們生產的磁盤的容量是256GB或1TB,而實際上這兩個數字表示2560億字節及1萬億字節。當然,2560億字節只有231MB,而1萬億字節只有911GB,所以磁盤制造商給出的硬盤容量有誤導作用。

有了字節的概念,下面看看如何在程序裡使用這些內存。

2.2 什麼是變量

變量是計算機裡一塊特定的內存,它是由一個或多個連續的字節所組成,一般是1、2、4、8或16字節。每個變量都有一個名稱,可以用該名稱表示內存的這個位置,以提取它包含的數據或存儲一個新數值。

下面編寫一個程序,用第1章介紹的printf()函數顯示你的薪水。假設你的薪水是10 000元/月,則很容易編寫這個程序。

// Program 2.1 What is a Variable?

#include

int main(void)

{

printf(My salary is $10000);

return 0;

}

這個程序的工作方式不需要多做解釋,它和第一章開發的程序差不多。如何修改這個程序,讓它能夠根據存儲在內存中的值,定制要顯示的信息?這有幾種方法,它們有一個共同點:使用變量。

在這個例子裡,可以分配一塊名為salary的內存,把值10 000存儲在該變量中。要顯示薪水時,可以使用給變量指定的名稱salary,將存儲在其中的值10 000顯示出來。程序用到變量名時,計算機就會訪問存儲在其中的值。變量的使用次數是不受限制的。當薪水改變時,只要改變salary變量存儲的值,整個程序就會使用新的值。當然,在計算機中,所有的值都存儲為二進制數。

程序中變量的數量是沒有限制的。在程序執行過程中,每個變量包含的值由程序的指令來決定。變量的值不是固定的,而可以隨時改變,且沒有次數的限制。

注意:

變量可以有一個或多個字節,那麼,計算機如何知道變量有多少個字節?下一節會提到,每個變量都有類型來指定變量可以存儲的數據種類。變量的類型決定了為它分配多少個字節。

變量的命名

給變量指定的名稱一般稱為變量名。變量的命名是很有彈性的。它可以是一個或多個大寫或小寫字母、數字和下劃線( _ )(有時下劃線也算作字母),但要以字母開頭。下面是一些正確的變量名:

Radius diameter Auntie_May Knotted_Wool D678

變量名不能以數字開頭,所以8_Ball和6_pack都是不合法的名稱。變量名只能包含字母、下劃線和數字,所以Hash!及Mary-Lou都不能用作變量名。Mary-Lou是一個常見的錯誤,但是Mary_Lou就是可以接受的。變量名中不能有空格,所以Mary Lou會被視為兩個變量名Mary和Lou。以一或兩個下劃線開頭的變量名常用在頭文件中,所以在給變量命名時,不要將下劃線用作第一個字符,以免和標准庫裡的變量名沖突。例如最好避免使用_this和_that這樣的變量名。變量名的另一個要點是,變量名是區分大小寫的,因此Democrat和democrat是不同的。

可以在上述限制內隨意指定變量名,但最好使變量名有助於了解該變量包含的內容,例如用變量名x來存儲薪水信息就不好,而使用變量名salary就好得多,對其用途不會有什麼疑義。

警告:

變量名可以包含的字符數取決於編譯器,遵循C語言標准的編譯器至少支持31個字符,只要不超過這個長度就沒問題。建議變量名不要超過這個長度,因為這樣的變量名比較繁瑣,代碼也難以理解。有些編譯器會截短過長的變量名。

2.3 存儲整數的變量

變量有幾種不同的類型,每種變量都用於存儲特定類型的數據。有幾種變量可存儲整數、非整數的數值和字符。一些類型存儲特定的數據(例如整數),它們之間的區別是它們占用的內存量和可以存儲的數值范圍。首先看看用於存儲整數的變量。

整數是沒有小數點的數字。下面是一個例子:

123 10,999,000,000 20,000 88 1

這些數值是整數,但這對程序而言並不完全正確。整數是不能包含逗號的,所以第二個值在程序裡應該寫成10999000000,第三個值應寫成20000。

下面是一些不是整數的例子:

1.234 999.9 2.0 –0.0005 3.14159265

2.0一般算作整數,但是計算機不將它算作整數,因為它帶有小數點。在程序裡,必須把這個數字寫作2,不帶小數點。在C程序中,整數總是寫成不帶小數點的數字,如果數字中有小數點,就不是整數,而是浮點數,詳見後面的內容。在詳細討論整型變量之前,先看看程序裡一個簡單的變量,學習變量的用法。

試試看:使用變量

回到輸出薪水的例子。將前面的程序改為使用一個int型變量:

// Program 2.2 Using a variable

#include

int main(void)

{

int salary; //Declare a variable called salary

salary = 10000; //Store 10000 in salary

printf(My salary is %d. , salary);

return 0;

}

輸入這個例子,編譯、鏈接並執行,會得到下面的結果:

My salary is 10000.

代碼的說明

前三行和前一個例子相同,下面看看新的語句。用來存放薪水的變量聲明語句如下:

intsalary; //Declare a variable called salary

這個語句稱為變量聲明,因為它聲明了變量的名稱。在這個程序中,變量名是salary。

警告:

變量聲明語句以分號結束。如果漏掉分號,程序編譯時會產生錯誤。

變量聲明也指定了這個變量存儲的數據類型,這裡使用關鍵字int指定,salary用來存放一個整數。關鍵字int放在變量名稱之前。這是可用於存儲整數的幾個類型之一。

如後面所述,聲明存儲其他數據類型的變量時,要使用另一個關鍵字指定數據類型,其方式大致相同。

注意:

關鍵字是特殊的C保留字,對編譯器有特殊的意義。不能將它們用作變量名稱或代碼中的其他實體,否則編譯器會生成錯誤消息。

變量聲明也稱為變量的定義,因為它分配了一些存儲空間,來存儲整數值,該整數可以用變量名salary來引用。

注意:

聲明引入了一個變量名,定義則給變量分配存儲空間。有這個區別的原因在本書後面會很清楚。

當然,現在還未指定變量salary的值,所以此刻該變量包含一個垃圾值,即上次使用這塊內存空間時遺留在此的值。

下一個語句是:

salary= 10000; //Store 10000 in salary

這是一個簡單的算術賦值語句,它將等號右邊的數值存儲到等號左邊的變量中。這裡聲明了變量salary,它的值是10 000。將右邊的值10 000存儲到左邊的變量salary中。等號“=”稱為賦值運算符,它將右邊的值賦予左邊的變量。

 

 

然後是熟悉的printf()語句,但這裡的用法和之前稍有不同:

printf(My salary is %d.,salary);

括號內有兩個參數,用逗號分開。參數是傳遞給函數的值。在這個程序語句中,傳給printf()函數的兩個參數如下:

● 參數1是一個控制字符串,用來控制其後的參數輸出以什麼方式顯示,它是放在雙引號內的字符串,也稱為格式字符串,因為它指定了輸出數據的格式。

● 參數2是變量名salary。這個變量值的顯示方式是由第一個參數——控制字符串來確定。

這個控制字符串和前一個例子相當類似,都包含一些要顯示的文本。但在本例的這個字符串中有一個%d,它稱為變量值的轉換說明符(conversion specifier)。

轉換說明符確定變量在屏幕上的顯示方式,換言之,它們指定最初的二進制值轉換為什麼形式,顯示在屏幕上。在本例中使用了d,它是應用於整數值的十進制說明符,表示第二個參數salary輸出為一個十進制數。

注意:

轉換說明符總是以%字符開頭,以便printf()函數識別出它們。控制字符串中的%總是表示轉換說明符的開頭,所以如果要輸出%字符,就必須用轉義序列%%。

試試看:使用更多的變量

試試一個稍大的程序:

// Program 2.3 Using more variables

#include

int main(void)

{

int brothers; //Declare a variable called brothers

int brides; //and a variable called brides

brothers = 7; //Store 7 in the variable brothers

brides = 7; //Store 7 in the variable brides

// Display some output

printf(%d brides for %d brothers , brides, brothers);

return 0;

}

執行程序的結果如下:

7 brides for 7 brothers;

代碼的說明

這個程序和前一個例子相當類似。首先聲明兩個變量brothers和brides,語句如下:

int brothers; //Declare a variable called brothers

int brides; //and a variable called brides

兩個變量都聲明為int類型,都存儲整數值。注意,它們在兩個語句中聲明。由於這兩個變量的類型相同,故可以將它們放在同一行代碼上聲明:

int brothers, brides;

在一個語句中聲明多個變量時,必須用逗號將數據類型後面的變量名分開,該語句要用分號結束。這是一種很方便的格式,但有一個缺點:每個變量的作用不很明顯,因為它們全放在一行代碼上,不能加入注釋來描述每個變量。因此可以將它們分成兩行,語句如下:

int brothers, //Declare a variable called brothers

brides; //and a variable called brides

將語句分成兩行,就可以加入注釋了。這些注釋會被編譯器忽略,因此和最初沒加入注釋的語句相同。可以將C語句分成好幾行。分號決定語句的結束,而不是代碼行的結束。

當然也可以編寫兩個聲明語句。一般最好在一個語句中定義一個變量。變量聲明常常放在函數的可執行語句的開頭,但這不是必須的。一般把要在一塊代碼中使用的變量聲明放在該起始括號的後面。

之後的兩個語句給兩個變量賦值7:

brothers = 7; // Store 7 in the variable brothers

brides = 7; // Store 7 in the variable brides

注意,聲明這些變量的語句放在上述語句之前。如果遺漏了某個聲明,或把聲明語句放在後面,程序就不會編譯。變量在其聲明之前在代碼中是不存在的,必須總是在使用變量之前聲明它。

下一個語句調用printf()函數,它的第一個參數是一個控制字符串,以顯示一行文本。這個字符串還包含規范,指定後續參數的值如何解釋和顯示在文本中。這個控制字符串中的兩個轉換說明符%d會分別被printf()函數的第二個參數brides和第三個參數brothers的值取代:

printf(%dbrides for %d brothers , brides, brothers);

轉換說明符按順序被printf()函數的第二個參數brides和第三個參數brothers的值取代:變量brides的值對應第一個%d,變量brothers的值對應第二個%d。如果將設置變量值的語句改為如下所示,將會更清楚:

brothers = 8; // Store 8 in the variable brothers

brides = 4; // Store 4 in the variable brides

在這個比較明確的例子中,printf()語句會清楚地顯示變量和轉換說明符的對應關系,因為輸出如下所示:

4 brides for 8 brothers

為了演示變量名是區分大小寫的,修改printf()函數,使其中一個變量名以大寫字母開頭,如下所示:

// Program 2.3A Using more variables

#include

int main(void)

{

int brothers; // Declare a variable called brothers

int brides; // and a variable called brides

brothers = 7; // Store 7 in the variable brothers

brides = 7; // Store 7 in the variable brides

// Display some output

printf(%d brides for %d brothers , Brides, brothers);

return 0;

}

編譯這個版本的程序時,會得到一個錯誤信息。編譯器把brides和Brides解釋為兩個不同的變量,所以它不理解Brides這個變量,因為沒有聲明它。這是一個常見的錯誤,如前所述,打字和拼寫錯誤是出錯的一個主要原因。變量必須在使用之前聲明,否則編譯器就無法識別,將該語句標識為錯誤。

2.3.1 變量的使用

前面介紹了如何聲明及命名變量,但這和在第一章學到的知識相比並沒有太多用處。下面編寫另一個程序,在產生輸出前使用變量的值。

試試看:作一個簡單的計算

這個程序用變量的值做簡單的計算:

// Program 2.4 Simple calculations

#include

int main(void)

{

int total_pets;

int cats;

int dogs;

int ponies;

int others;

// Set the number of each kind of pet

cats = 2;

dogs = 1;

ponies = 1;

others = 46;

// Calculate the total number of pets

total_pets = cats + dogs + ponies + others;

printf(We have %d pets in total , total_pets); // Output the result

return 0;

}

執行程序的結果如下:

Wehave 50 pets in total

代碼的說明

與前面的例子一樣,大括號中的所有語句都有相同的縮進量,這說明這些語句都包含在這對大括號中。應當仿效此法組織程序,使位於一對大括號之間的一組語句有相同的縮進量,使程序更易於理解。

首先,定義5個int類型的變量:

int total_pets;

int cats;

int dogs;

int ponies;

int others;

因為這些變量都用來存放動物的數量,它們肯定是整數,所以都聲明為int類型。

下面用4個賦值語句給變量指定特定的值:

cats = 2;

dogs = 1;

ponies = 1;

others = 46;

現在,變量Total_Pets還沒有設定明確的值,它的值是使用其他變量進行計算的結果:

total_pets= cats + dogs + ponies + others;

在這個算術語句中,把每個變量的值加在一起,計算出賦值運算符右邊的所有寵物數的總和,再將這個總和存儲到賦值運算符左邊的變量Total_Pets中。這個新值替代了存儲在變量Total_Pets中的舊值。

printf()語句顯示了變量Total_Pets的值,即計算結果:

printf(Wehave %d pets in total , total_pets);

試著改變某些寵物的值,或增加一些寵物。記住要聲明它們,給它們設定數值,將它們加進變量Total_Pets中。

2.3.2 變量的初始化

在上面的例子,用下面的語句聲明每個變量:

intcats; //The number of cats as pets

 

 

用下面的語句設定變量Cats的值:

Cats = 2;

將變量Cats的值設為2。這個語句執行之前,變量的值是什麼?它可以是任何數。第一個語句創建了變量Cats,但它的值是上一個程序在那塊內存中留下的數值。其後的賦值語句將變量Cats的值設置為2。但最好在聲明變量時,就初始化它,語句如下所示:

int Cats = 2;

這個語句將變量Cat聲明為int類型,並設定初值為2。聲明變量時就初始化它一般是很好的做法。它可避免對初始值的懷疑,當程序運作不正常時,它有助於追蹤錯誤。避免在創建變量時使用垃圾值,可以減少程序出錯時計算機崩潰的機會。隨意使用垃圾值可能導致各種問題,因此從現在起,就養成初始化變量的好習慣,即使是0也好。

上面的程序是第一個真正做了些事情的程序。它非常簡單,僅僅相加了幾個數字,但這是非常重要的一步。它是運用算術語句進行運算的一個基本例子。下面介紹一些更復雜的計算。

1. 基本算術運算

在C語言中,算術語句的格式如下:

變量名= 算術表達式;

賦值運算符右邊的算術表達式指定使用變量中存儲的值和/或明確給出的數字,以及算術運算符如加(+)、減(-)、乘(*)及除(/)進行計算。在算術表達式中也可以使用其他運算符,如後面所述。

前面例子中的算術語句如下:

total_pets= cats + dogs + ponies + others;

這個語句先計算等號右邊的算術表達式,再將所得的結果存到左邊的變量中。

在C語言中,符號“=”定義了一個動作,而不是像數學中那樣說明兩邊相等。它指定將右邊表達式的結果存到左邊的變量中。因此可以編寫下面的語句:

total_pets= total_pets + 2;

以數學的觀點來看,它是很荒唐的,但對編程而言它是正確的。假定重新編寫程序,添加上面的語句。添加了這個語句的程序段如下:

total_pets = cats + dogs + ponies + others;

total_pets =total_pets + 2;

printf(The total number of petsis: %d, total_pets);

在執行完第一個語句後,Total_Pets的值是50。之後,第二行提取Total_Pets的值,給該值加2,再將結果存儲回變量Total_Pets。因此最後顯示出來的總數是52。

注意:

在賦值運算中,先計算等號右邊的表達式,然後將結果存到等號左邊的變量中。新的值取代賦值運算符左邊的變量中的原值。賦值運算符左邊的變量稱為lvalue,因為在這個位置可以存儲一個值。執行賦值運算符右邊的表達式所得的值稱為rvalue,因為它是計算表達式所得的一個值。

計算結果是數值的表達式稱為算術表達式,下面都是算術表達式:

3 1 + 2 total_pets cats + dogs – ponies -data

計算這些表達式,都會得到一個數值。注意,變量名也是一個表達式,它的計算結果是一個值,即該變量包含的值。最後一個例子的值是data的負值,所以如果data包含-5,表達式-data的值就是5。當然,data的值仍是-5。稍後將詳細討論如何構建表達式,並學習運算規則。這裡先用基本算術運算符做一些簡單的例子。表2-1列出了這些算術運算符。

表2-1 基本算術運算符

運 算 符

動 作

+

-

*

/

%

取模(Modulus)

應用運算符的數據項一般稱為操作數,兩邊的操作數都是整數時,所有這些運算符都生成整數結果。前面沒有提到過取模運算符。它用運算符左邊的表達式值去除運算符右邊的表達式值,並求出其余數,所以有時稱為余數運算符。表達式12 % 5的結果是2。因為12除以5的余數是2。下一節將詳細介紹。所有這些運算符的工作方式都與我們的常識相同,只有除法運算符例外,它應用於整數時有點不直觀。下面進行一些算術運算。

注意:

應用運算符的值稱為操作數。需要兩個操作數的運算符(如%)稱為二元運算符。應用於一個值的運算符稱為一元運算符。因此-在表達式a-b中是二元運算符,在表達式-data中是一元運算符。

試試看:減和乘

下面基於食物的程序演示了減法和乘法:

// Program 2.5 Calculations with cookies

#include

int main(void)

{

int cookies = 5;

int cookie_calories = 125; //Calories per cookie

int total_eaten = 0; //Total cookies eaten

int eaten = 2; // Number to be eaten

cookies = cookies - eaten; // Subtract number eaten fromcookies

total_eaten = total_eaten + eaten;

printf( I have eaten %d cookies. There are %d cookies left,

eaten, cookies);

eaten = 3; // New value for cookies eaten

cookies = cookies - eaten; // Subtract number eaten from cookies

total_eaten = total_eaten + eaten;

printf( I have eaten %d more. Now there are %d cookiesleft , eaten, cookies);

printf( Total energy consumed is %dcalories. , total_eaten*cookie_calories);

return 0;

}

這個程序產生如下輸出:

I have eaten 2 cookies. There are 3 cookies left

I have eaten 3 more. Now there are 0cookies left

Total energy consumedis 625 calories.

代碼的說明

首先聲明並初始化3個int類型的變量:

int cookies = 5;

int cookie_calories =125; //Calories per cookie

int total_eaten = 0; //Total cookies eaten

在程序中,使用變量total_eaten計算吃掉的餅干總數,所以要將它初始化為0。

下一個聲明並初始化的變量存儲吃掉的餅干數,如下:

inteaten = 2; // Number to be eaten

用減法運算符從cookies中減掉eaten:

cookies= cookies - eaten; //Subtract number eaten from cookies

減法運算的結果存回cookies變量,所以cookies的值變成3。因為吃掉了一些餅干,所以要給total_eaten增加吃掉的餅干數:

total_eaten= total_eaten + eaten;

將eaten變量的當前值2加到total_eaten的當前值0上,結果存儲回變量total_eaten。printf()語句顯示剩下的餅干數:

printf( I have eaten %d cookies. There are%d cookies left,

eaten, cookies);

這個語句在一行上放不下,所以在printf()的第一個參數後的逗號後面,將該語句的其他內容放在下一行上。可以像這樣分拆語句,使程序易於理解,或放在屏幕的指定寬度之內。注意不能用這種方式拆分第一個字符串參數。不能在字符串的中間放置換行符。需要將字符串拆開成兩行或多行時,一行上的每一段字符串必須有自己的一對雙引號。例如,上面的語句可以寫成:

printf( I have eaten %d cookies.

There are %d cookies left,

eaten, cookies);

如果兩個或多個字符串彼此相鄰,編譯器會將它們連接起來,構成一個字符串。

用整數值的轉換說明符%d將eaten和cookies的值顯示出來。在輸出字符串中,eaten的值取代第一個%d, cookies的值取代第二個%d。字符串在顯示之前會先換行,因為開頭處有一個 。

下一個語句將變量eaten的值設為一個新值:

eaten= 3; // New value for cookies to beeaten

新值3取代eaten變量中的舊值2。然後完成和以前一樣的操作序列:

cookies = cookies - eaten; // Subtract numbereaten from cookies

total_eaten =total_eaten + eaten;

printf( I have eaten %d more.Now there are %d cookies left , eaten, cookies);

最後,在執行return語句,結束程序前,計算並顯示被吃掉餅干的卡路裡數:

printf( Totalenergy consumed is %d calories. , total_eaten*cookie_calories);

printf()函數的第二個參數是一個算術表達式,而不是變量。編譯器會將表達式total_eaten*cookie_calories的計算結果存儲到一個臨時變量中,再把該值作為第二個參數傳送給printf()函數。函數的參數總是可以使用算術表達式,只要其計算結果是需要的類型即可。

下面看看除法和取模運算符。

試試看:除法和取模運算符

假設你有一罐餅干(其中有45塊餅干)和7個孩子。要把餅干平分給每個孩子,計算每個孩子可得到幾塊餅干,分完後剩下幾塊餅干。

// Program 2.6 Cookies and kids

#include

int main(void)

{

int cookies = 45; //Number of cookies in the jar

int children = 7; //Number of children

int cookies_per_child = 0; //Number of cookies per child

int cookies_left_over = 0; // Number of cookiesleft over

// Calculate how many cookies each child gets when they are divided up

cookies_per_child = cookies/children; //Number of cookies per child

printf(You have %d children and %d cookies , children,cookies);

printf(Give each child %d cookies. ,cookies_per_child);

// Calculate how many cookies are left over

cookies_left_over = cookies%children;

printf(There are %d cookies left over. , cookies_left_over);

return 0;

}

執行程序後的輸出:

You have 7 children and 45 cookies

Give each child 6cookies.

There are 3 cookiesleft over.

代碼的說明

下面一步一步地解釋這個程序。下面的語句聲明並初始化4個整數變量:cookies、children、cookies_per_child、cookies_left_over:

int cookies = 45; // Number of cookies in the jar

int children = 7; // Number of children

int cookies_per_child= 0; //Number of cookies per child

int cookies_left_over = 0; //Number of cookies left over

使用除號運算符“/”將餅干數量除以孩子的數量,得到每個孩子分得的餅干數:

cookies_per_child= cookies/children; //Number of cookies per child

下面兩個語句輸出結果,即cookies/children變量的值:

printf(You have %d children and %dcookies , children, cookies);

printf(Give each child %dcookies. , cookies_per_child);

從輸出結果可以看出,cookies_per_child的值是6。這是因為當操作數是整數時,除法運算符總是得到整數值。45除以7的結果是6,余3。下面的語句用取模運算符計算余數:

cookies_left_over= cookies%children;

賦值運算符右邊的表達式計算cookies除以children得到的余數。最後一個語句輸出余數:

printf(Thereare %d cookies left over. , cookies_left_over);

2. 深入了解整數除法

當一個操作數是負數時,使用除法和模數運算符的結果是什麼?在執行除法運算時,如果操作數不同號,結果就是負數。因此,表達式-45/7和45/-7的結果相同,都是-6。如果操作數同號,都是正數或都是負數,結果就是正數。因此45/7和-45/-7結果都是6。至於模數運算符,不管操作數是否同號,其結果總是和左操作數的符號相同。因此45%-7等於3,-45/7等於-3,-45/-7也等於-3。

3. 一元運算符

例如,乘法運算符是一個二元運算符。因為它有兩個操作數,其結果是一個操作數乘以另一個操作數。還有一些運算符是一元運算符,即它們只需一個操作數。後面將介紹更多的例子。但現在看看一個最常用的一元運算符。

4. 一元減號運算符

前面使用的運算符都是二元運算符,因為它們都操作兩個數據項。C語言中也有操作一個數據項的一元運算符。一元減號運算符就是一個例子。若操作數為負,它就生成正的結果,若操作數為正,它就生成負的結果。要了解一元減號運算符的使用場合,考慮一下追蹤銀行賬號。假定我們在銀行存了200元。在簿子裡用兩列記錄這筆錢的收支情況,一列記錄付出的費用,另一列記錄得到的收入,支出列是負數,收入列是正數。

我們決定購買一片價值50元的CD和一本價值25元的書。假使一切順利,從銀行的初始值中減掉支出的75元後,就得到了余額。表2-2說明這些項的記錄情況。

表2-2 收入與支出記錄

收 入

支 出

存 款 余 額

支票收入

$200

 

$200

CD

 

$50

$150

 

$25

$125

結余

$200

$75

$125

如果將這些數字存儲到變量中,可以將收入及支出都輸入為正數,只有計算余額時,才會把這些數字變成負數。為此,可以將一個負號(-)放在變量名的前面。

要把總支出輸出為負數,可編寫如下語句:

int expenditure = 75;

printf(Your balance has changedby %d., -expenditure);

這會產生如下結果:

Yourbalance has changed by -75.

負號表示花掉了這筆錢,而不是賺了。注意,表達式-expenditure不會改變expenditure變量的值,它仍然是75。這個表達式的值是-75。

在表達式-expenditure中,一元減號運算符指定了一個動作,其結果是翻轉expenditure變量的符號:將負數變成正數,將正數變成負數。這和編寫一個負數(如-75或-1.25)時使用的負號運算符是不同的。此時,負號不表示一個動作,程序執行時,不需要執行指令。它只是告訴編譯器,在程序裡創建一個負的常量。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved