詳解C說話中的符號常量、變量與算術表達式。本站提示廣大學習愛好者:(詳解C說話中的符號常量、變量與算術表達式)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C說話中的符號常量、變量與算術表達式正文
C說話中的符號常量
在停止評論辯論溫度轉換法式前,我們再來看一下符號常量。在法式中應用 300、20 等相似的“幻數”其實不是一個好習氣,它們簡直沒法向今後浏覽該法式的人供給甚麼信息,並且使法式的修正變得加倍艱苦。處置這類幻數的一種辦法是付與它們成心義的名字。#define 指令可以把符號名(或稱為符號常量)界說為一個特定的字符串:
#define 名字 調換文本
在該界說以後,法式中湧現的一切在 #define 中界說的名字(既沒有效引號惹起來,也不是其它名字的一部門)都將用響應的調換文本調換。個中,名字與通俗變量名的情勢雷同:它們都是以字母打頭的字母和數字序列;調換文本可所以任何字符序列,而不只限於數字。
在該界說以後,法式中湧現的一切在 #define 中界說的名字(既沒有效引號惹起來,也不是其它名字的一部門)都將用響應的調換文本調換。個中,名字與通俗變量名的情勢雷同:它們都是以字母打頭的字母和數字序列;調換文本可所以任何字符序列,而不只限於數字。
#include <stdio.h> #define LOWER 0 /* lower limit of table */ #define UPPER 300 /* upper limit */ #define STEP 20 /* step size */ /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
個中,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 <stdio.h> /* 當 fahr=0,20,… ,300 時,分離打印華氏溫度與攝氏溫度對比表 */ main() { int i; int fahr, celsius; int lower, upper, step; lower = 0; /* 溫度表的上限 */ upper = 300; /* 溫度表的下限 */ step = 20; /* 步長 */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } 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 <stdio.h> /* print Fahrenheit-Celsius table for fahr = 0, 20, ..., 300; floating-point version */ main() { float fahr, celsius; float lower, upper, step; lower = 0; upper = 300; step = 20; /* lower limit of temperatuire scale */ /* upper limit */ /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } }
這個法式與前一個法式根本雷同,分歧的是,它把 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 表現字符串;%%表現百分號(%)自己。