1C語言入門 2常量 變數和表示式 5表示式

2022-10-15 17:45:09 字數 4001 閱讀 2490

第2章常量、變數和表示式

5.表示式

常量和變數都可以參與加減乘除運算,例如1+1、hour-1、hour * 60 + minute、minute/60等。這裡的+ - * /稱為運算子(operator),而參與運算的常量和變數稱為運算元(operand),上面四個由運算子和運算元所組成的算式稱為表示式(expression)。

和數學上規定的一樣,hour * 60 + minute這個表示式應該先算乘再算加,也就是說運算子是有優先順序(precedence)的,*和/是同一優先順序,+和-是同一優先順序,*和/的優先順序高於+和-。對於同一優先順序的運算從左到右計算,如果不希望按預設的優先順序計算則要加()括號(parenthesis)。例如(3+4)*5/6應先算3+4,再算*5,再算/6。

前面講過列印語句和賦值語句,現在我們定義:在任意表示式後面加個;號也是一種語句,稱為表示式語句。例如:

hour * 60 + minute;

這是個合法的語句,但這個語句在程式中起不到任何作用,把hour的值和minute的值取出來加乘,得到的計算結果卻沒有儲存,白算了一通。再比如:

int total_minute;

total_minute = hour * 60 + minute;

這個語句就很有意義,把計算結果儲存在另乙個變數total_minute裡。事實上等號也是一種運算子,稱為賦值運算子,賦值語句就是一種表示式語句,等號的優先順序比+和*都低,所以先算出等號右邊的結果然後才做賦值操作,整個表示式total_minute = hour * 60 + minute加個;號構成乙個語句。

任何表示式都有值和型別兩個基本屬性。hour * 60 + minute的值是由三個int型的運算元計算出來的,所以這個表示式的型別也是int型。同理,表示式total_minute = hour * 60 + minute的型別也是int,它的值是多少呢?

c語言規定等號運算子的計算結果就是等號左邊被賦予的那個值,所以這個表示式的值和hour * 60 + minute的值相同,也和total_minute的值相同。

等號運算子還有乙個和+ - * /不同的特性,如果乙個表示式**現多個等號,不是從左到右計算而是從右到左計算,例如:

int total_minute, total;

total = total_minute = hour * 60 + minute;

計算順序是先算hour * 60 + minute得到乙個結果,然後算右邊的等號,就是把hour * 60 + minute的結果賦給變數total_minute,這個結果同時也是整個表示式total_minute = hour * 60 + minute的值,再算左邊的等號,即把這個值再賦給變數total。同樣優先順序的運算子是從左到右計算還是從右到左計算稱為運算子的結合性(associativity)。+ - * /是左結合的,等號是右結合的。

現在我們總結一下到目前為止學過的語法規則:

表示式→識別符號

表示式→常量

表示式→字串字面值

表示式→(表示式)

表示式→表示式+表示式

表示式→表示式-表示式

表示式→表示式*表示式

表示式→表示式/表示式

表示式→表示式=表示式

語句→表示式;

語句→printf(表示式,表示式,表示式,...);

變數宣告→型別識別符號=initializer,識別符號=initializer,...;

(=initializer的部分可以不寫)

注意,本書所列的語法規則都是簡化過的,是不準確的,目的是為了便於初學者理解,比如上面所列的語法規則並沒有描述運算子的優先順序和結合性。完整的c語法規則請參考[c99]的annex a。

表示式可以是單個的常量或變數,也可以是根據以上規則組合而成的更複雜的表示式。以前我們用printf列印常量或變數的值,現在可以用printf列印更複雜的表示式的值,例如:

printf("%d:%d is %d minutes after 00:00\n", hour, minute, hour * 60 + minute);

編譯器在翻譯這條語句時,首先根據上述語法規則把這個語句解析成下圖所示的語法樹,然後再根據語法樹生成相應的指令。語法樹的末端的是乙個個token,每一步展開利用一條語法規則。

圖2.2.語法樹

根據這些語法規則進一步組合可以寫出更複雜的語句,比如在一條語句中完成計算、賦值和列印功能:

printf("%d:%d is %d minutes after 00:00\n", hour, minute, total_minute = hour * 60 + minute);

理解組合(composition)規則是理解語法規則的關鍵所在,正因為可以根據語法規則任意組合,我們才可以用簡單的常量、變數、表示式、語句搭建出任意複雜的程式,以後我們學習新的語法規則時會進一步體會到這一點。從上面的例子可以看出,表示式不宜過度組合,否則會給閱讀和除錯帶來困難。

根據語法規則組合出來的表示式在語義上並不總是正確的,例如:

minute + 1 = hour;

等號左邊的表示式要求表示乙個儲存位置而不是乙個值,這是等號運算子和+ - * /運算子的又乙個顯著不同。有的表示式既可以表示乙個儲存位置也可以表示乙個值,而有的表示式只能表示值,不能表示儲存位置,例如minute + 1這個表示式就不能表示儲存位置,放在等號左邊是語義錯誤。表示式所表示的儲存位置稱為左值(lvalue)(允許放在等號左邊),而以前我們所說的表示式的值也稱為右值(rvalue)(只能放在等號右邊)。

上面的話換一種說法就是:有的表示式既可以做左值也可以做右值,而有的表示式只能做右值。目前我們學過的表示式中只有變數可以做左值,可以做左值的表示式還有幾種,以後會講到。

我們看乙個有意思的例子,如果定義三個變數int a, b, c;,表示式a = b = c是合法的,先求b = c的值,再把這個值賦給a,而表示式(a = b) = c是不合法的,先求(a = b)的值沒問題,但(a = b)這個表示式不能再做左值了,因此放在= c的等號左邊是錯的。

關於整數除法運算有一點特殊之處:

hour = 11;

minute = 59;

printf("%d and %d hours\n", hour, minute / 60);

執行結果是11 and 0 hours,也就是說59/60得0,這是因為兩個int型運算元相除的表示式仍為int型,只能儲存計算結果的整數部分,即使小數部分是0.98也要捨去。

向下取整的運算稱為floor,用數學符號表示;向上取整的運算稱為ceiling,用數學符號表示。例如:

59/60=0

59/60=1

-59/60=-1

-59/60=0

在c語言中整數除法取的既不是floor也不是ceiling,無論運算元是正是負總是把小數部分截掉,在數軸上向零的方向取整(truncate toward zero),或者說當運算元為正的時候相當於floor,當操作符為負的時候相當於ceiling。回到先前的例子,要得到更精確的結果可以這樣:

printf("%d hours and %d percent of an hour\n", hour, minute * 100 / 60);

printf("%d and %f hours\n", hour, minute / 60.0);

在第二個printf中,表示式是minute / 60.0,60.0是double型的,/運算子要求左右兩邊的運算元型別一致,而現在並不一致。

c語言規定了一套隱式型別轉換規則,在這裡編譯器自動把左邊的minute也轉成double型來計算,整個表示式的值也是double型的,在格式化字串中應該用%f轉換說明與之對應。本來程式語言作為一種形式語言要求有簡單而嚴格的規則,自動型別轉換規則不僅很複雜,而且使c語言的形式看起來也不那麼嚴格了,c語言這麼設計是為了書寫程式簡便而做的折衷,有些事情編譯器可以自動做好,程式設計師就不必每次都寫一堆繁瑣的轉換**。然而c語言的型別轉換規則非常難掌握,本書的前幾章會盡量避免型別轉換,到第3節 「型別轉換」再集中解決這個問題。

習題1、假設變數x和n是兩個正整數,我們知道x/n這個表示式的結果要取floor,例如x是17,n是4,則結果是4。如果希望結果取ceiling應該怎麼寫表示式呢?例如x是17,n是4,則結果是5;x是16,n是4,則結果是4。

1 C實驗指導

實驗一 1 c 與.net概述 一 實驗目標 1 編寫第乙個控制台的輸入與輸出程式 2 建立第乙個windows窗體應用程式 二 實驗內容及步驟 1 控制台的輸入與輸出 問題 在控制台上實現文字的輸入與輸出。問題說明 按照提示輸入自己的姓名,程式輸出你輸入的名字,並歡迎使用c 語言。主要使用cons...

1C程式設計實驗二

c 物件導向程式設計一 實驗要求 1 通過一些簡單類的定義,掌握類和物件中資料成員和方法成員的設定 2 掌握類的特殊方法 建構函式 屬性的使用。實驗內容 1 新建專案salary,新增乙個職員類employee,有私有字段姓名 年齡 性別和薪水。為職員類編寫建構函式,引數為string int st...

1C 程式設計教學的探索

摘要 本文主要介紹了c 程式設計課程教學的一些實踐經驗,對c 教學方式及課程設計 考試環節等方面的改革進行了 關鍵詞 教學方法 程式設計 c 考試方式 中圖分類號 g642文獻標識碼 b 1c 程式設計教學的探索 我校屬於二類本科院校,在1999年就在計算機專業正式開設 c 程式設計 總學時75學時...