詳解C語言中的符號常量 變數與算術表示式

2022-10-07 06:45:09 字數 4652 閱讀 8976

c語言中的符號常量

在結束討論溫度轉換程式前,我們再來看一下符號常量。在程式中使用 300、20 等類似的「幻數」並不是乙個好習慣,它們幾乎無法向以後閱讀該程式的人提供什麼資訊,而且使程式的修改變得更加困難。處理這種幻數的一種方法是賦予它們有意義的名字。#define 指令可以把符號名(或稱為符號常量)定義為乙個特定的字串:

#define 名字 替換文字

在該定義之後,程式**現的所有在 #define 中定義的名字(既沒有用引號引起來,也不是其它名字的一部分)都將用相應的替換文字替換。其中,名字與普通變數名的形式相同:它們都是以字母打頭的字母和數字序列;替換文字可以是任何字串行,而不僅限於數字。

在該定義之後,程式**現的所有在 #define 中定義的名字(既沒有用引號引起來,也不是其它名字的一部分)都將用相應的替換文字替換。其中,名字與普通變數名的形式相同:它們都是以字母打頭的字母和數字序列;替換文字可以是任何字串行,而不僅限於數字。

#include

#define lower 0 /* lower limit of table */

#define upper 300 /* upper limit */

#define step 20 /* step size */

/* print fahrenheit-celsius table */

main()

其中,lower、upper 與 step 都是符號常量,而非變數,因此不需要出現在宣告中。符號常量名通常用大寫字母拼寫,這樣可以很容易與用小寫字母拼寫的變數名相區別。注意,#define 指令行的末尾沒有分號。

變數與算術表示式

我們來看下乙個程式,使用公式℃=(5/9)(℉-32)列印下列華氏溫度與攝氏溫度對照表:

0 -17

20 -6

40 4

60 15

80 26

100 37

120 48

140 60

160 71

180 82

200 93

220 104

240 115

260 126

280 137

300 148

此程式中仍然只包括乙個名為 main 的函式定義。它比前面列印「hello, world」的程式長一些,但並不複雜。這個程式中引入了一些新的概念,包括注釋、宣告、變數、算術表示式、迴圈以及格式化輸出。該程式如下所示:

#include

/* 當 fahr=0,20,… ,300 時,分別列印華氏溫度與攝氏溫度對照表 */

main()

scanf("%s", &i);

}其中的一行:

/*當 fahr=0,20,… ,300 時,分別列印華氏溫度與攝氏溫度對照表 */

稱為注釋,此處,它簡單地解釋,該程式是做什麼用的。包含在/*與*/之間的字串行將被編譯器忽略。注釋可以自由地運用在程式中,使得程式更易於理解。程式中允許出現空格、製表符或換行符之處,都可以使用注釋。

在 c 語言中,所有變數都必須先宣告後使用。宣告通常放在函式起始處,在任何可執行語句之前。宣告用於說明變數的屬性,它由乙個型別名和乙個變數表組成,例如:

int fahr, celsius;

int lower, upper, step;

其中,型別 int 表示其後所列變數為整數,與之相對應的,float 表示所列變數為浮點數(即可以帶有小數部分的數)。int 與 float 型別的取值範圍取決於具體的機器。對於 int 型別,通常為 16 位,其取值範圍在-32768~32767 之間,也有用 32 位表示的 int 型別。float 型別通常是 32 位,它至少有 6 位有效數字,取值範圍一般在 10-38~1038 之間。

除 int 與 float 型別之外,c 語高還提供了其它一些基本資料型別,例如:

這些資料型別物件的大小也取決於具體的機器。另外,還存在這些基本資料型別的陣列、結構、聯合,指向這些型別的指標以及返回這些型別值的函教。

在上面的溫度轉換程式中,最開始執程式設計客棧行的計算是下列 4 個賦值語句:

lower = 0;

upper = 300;

step = 20;

fahr = lower;

它們為變數設定初值。各條語句均以分號結束。

溫度轉換表中的各行計算方式相同,因此可以用迴圈語句重複輸出各行。這是 while 迴圈語句的用途:

while (fahr <= upper)

while迴圈語句的執行方式是這樣的:首先測試圓括號中的條件;如果條件為真(fahr<=upper),則執行迴圈體(括在花括號中的 3 條語句);然後再重新測試圓括號中的條件,如果為真,則再次執行迴圈體;當圓括號中的條件測試結果為假(fahr>upper)時,迴圈結束,並繼續執行跟在 while 迴圈語句之後的下一條語句。在本程式中,迴圈語句後沒有其它語句,因此整個程式的執行終止。

while 語句的迴圈體可以是用花括號括起來的一條或多條語句(如上面的溫度轉換程式),也可以是不用花括號包括的單條語句,例如:

while (i < j)

i = 2 * i;

在這兩種情況下,我們總是把由 while 控制的語句縮排乙個製表位,這樣就可以很容易地看出迴圈語句中包含哪些語句。這種縮排方式突出了程式的邏輯結構。儘管 c 編譯器並不關心程式的外觀形式,但正確的縮排以及保留適當空格的程式設計風格對程式的易讀性非常重要。我們建議每行只書寫一條語句,並在運算子兩邊各加上乙個空格字元,這樣可以使得運算的結合關係更清楚明了。相比而言,花括號的位置就不那麼重要了。我們從比較流行的一些風格中選擇了一種,讀者可以選擇適合自己的一種風格,並養成一直使用這種風格的好習慣。

在該程式中,絕大部分工作都是在迴圈體中完成的。迴圈體中的賦值語句:

printf(" %d\t%d\n", fahr, celsius);

用於列印兩個整數 fahr 與 celsius 的值,並在兩者之間留乙個製表符的空間(\t)。

printf 函式的第乙個引數中的各個%分別對應於第二個、第三個、……引數,它們在數目和型別上都必須匹配,否則將出現錯誤的結果。

順便指出,printf 函式並不是 c 語言本身的一部分,c 語言本身並沒有定義輸入/輸出功能。printf 僅僅是標準庫函式中乙個有用的函式而已,這些標準序函式在 c 語言程式中通常都可以使用。但是,ansi 標準定義了 printf 函式的行為,因此,對每個符合該標準的編譯器和庫來說,該函式的屬性都是相同的。

上述的溫度轉換程式存在兩個問題。比較簡單的問題是,由於輸出的數不是右對齊的,所以輸出的結果不是很美觀。這個問題比較容易解決:如果在 printf 語句的第乙個引數的%d 中指明列印寬度,則列印的數字會在列印區域內右對齊。例如,可以用語句

printf(" %3d %6d\n", fahr, celsius);

列印 fahr 與 celsius 的值,這樣,fahr 的值佔 3 個數字寬,celsius 的值佔 6 個數字寬,輸出的結果如下所示:

0 -17

20 -6

40 4

60 15

80 26

100 37

...另乙個較為嚴重的問題是,由於我們使用的是整型算術運算,因此經計算得到的攝氏溫度值不太精確,例如,與 0℉對應的精確的攝氏溫度應該為-17.8℃,而不是-17℃。為了得到更精確的結果,應該用浮點算術運算代替上面的整型算術運算。這就需要對程式做適當修改。下面是該程式的又一種版本

#include

/* print f程式設計客棧ahrenheit-celsius table

for fahr = 0, 20, ..., 300; floating-point version */

main()

}這個程式與前乙個程式基本相同,不同的是,它把 fahr 與 celsius 宣告為 float 型別,轉換公式的表述方式也更自然一些。在前乙個程式中,之所以不能使用 5 / 9 的形式,是因為按整型除法的計算規則,它們相除並舍位後得到的結果為 0。但是,常數中的小數點表明該常數是乙個浮點數,因此,5.0 / 9.0 是兩個浮點數相除,結果將不被舍位。

如果某個算術運算子的所有運算元均為整型,則執行整型運算。但是,如果某個算術運算子有乙個浮點型運算元和乙個整型運算元,則在開始運算之前整型運算元將會被轉換為浮點型。例如,在表示式 fahr – 32 中,32 在運算過程中將被自動轉換為浮點數再參與運算。不過,即使浮點常量取的是整型值,在書寫時最好還是為它加上乙個顯式的小數點,這樣可以強調其浮點性質,便於閱讀。

在這裡需要注意,賦值語句 fahr = lower; 與條件測試語句 while (fahr <= upper) 也都是按照這種方式執行的,即在運算之前先把 int 型別的運算元轉換為 float 型別的運算元。

printf 中的轉換說明%3.0f 表明待列印的浮點數(即 fahr)至少佔 3 個字元寬,且不帶小數點和小數部分;%6.1f 表明另乙個待列印的數(celsius)至少佔 6 個字元寬,且小數點後面有 1 位數字。其輸出如下所示:

0 -17.8

20 -6.7

40 4.4

...格式說明可以省略寬度與精度,例如,%6f 表示待列印的浮點數至少有 6 個字元寬;%.2f指定待列印的浮點數的小數點後有兩位小數,但寬度沒有限制;%f 程式設計客棧則僅僅要求按照浮點數列印該數。

此外,printf 函式還支援下列格式說明:%o 表示八進位制數;%x 表示十六進製制數;%c表示字元;%s 表示字串;%%表示百分號(%)本身。

本文標題: 詳解c語言中的符號常量、變數與算術表示式

本文位址: /ruanjian/c/135886.html

c語言中的變數及常量

變數 char 字元型變數,長度為乙個位元組 short 短整形,長度為兩個位元組 int 整形變數,長度為四個位元組 定義整形變數時優先考慮使用int long 長整形變數,長度為四個位元組 long long 更長的整形變數,長度為八個位元組 float 單精度浮點數,長度為四個位元組 doub...

C語言 常量,變數及資料詳細介紹

一 資料 文字等都是資料,在計算機中以0和1儲存。一 分類 資料分為靜態資料和動態資料。靜態資料 一些永程式設計客棧久性的的資料,一般儲存在硬碟中,只要硬碟沒壞資料都是存在的。一般以檔案的形式儲存在硬碟上,電腦關機重啟後依然存在。動態資料 程式執行過程中,動態產生的的臨時資料,一般儲存在記憶體中,記...

C語言中常量和變數

在c語言中,常量和變數都是可以用來儲存和表示資料的,常量值在程式執行的過程中是不可變的,而變數是可變的 1,常量的概念 常量是不可變的量,c語言中數值可以用常量表示,常量可以表示各種資料型別的值 2,變數的概念 變數和常量是相對的,變數在程式執行過程中是可變的量,由變數名和變數值組成,變數名是乙個標...