第三章數據和C
3.1示例程序
- #include<stdio.h>
- int main(void)
- {
- float weight,value;
- scanf("%f",&weight);
- value=770*weight*14.5833;
- printf("Your weight in rhodium is worth $%.2f.\n",value);
- return 0;
- }
3.2變量與常量數據
有些數據可以在程序使用之前預先設定並在整個運行過程中沒有變化,這稱為常量。另外的數據在運行過程中可能變化或被賦值,這被稱之為變量。
變量的值可以在程序執行過程中變化與指定,而常量則不可以。
3.3數據:數據類型關鍵字
常量數據,編譯器一般通過其書寫來辨認其類型。
變量則需要在聲明語句中指定其類型。
K&R C給出的7個數據類型相關的關鍵字:int,long,short,unsigned,char,float,double;
c90 給出的2個數據類型相關的關鍵字 :signed,void;
C99 給出的3個數據類型相關的關鍵字 :_Bool,_Complex,_Imaginary;(布爾值,復數,虛數)
整數 :沒有小數部分的數,以二進制數字存儲。
浮點數:加了小數點的值是浮點型值,浮點數表示法將一個數分為小數部分和指數部分分別存儲,它的表示范圍比整數大得多,進行算術運算會損失更多精度,通常比整數運算慢。
3.4C數據類型
C的各種整數類型的區別在於所提供數值的范圍,以及數值是否可以取負值。
初始化變量就是為變量賦一個初始值。
聲明語句為變量創建、標定存儲空間並為其指定初始值。
int類型
int類型是有符號整數,其取值范圍依賴於計算機系統,一般地,int類型存儲在計算機的一個字中。ISO/ANSI C規定int類型的最小范圍是-32768到32767。
C把不含小數點和指數的數當作整數。
前綴0x或者0X表示使用十六進制值,前綴0表示使用八進制。
使用不同數制系統的選擇是為了方便而提供,它並不影響數字的存儲(二進制編碼進行存儲)。
%d顯示十進制數字,%o顯示八進制數字,%x顯示十六進制數字。如果想要顯示C語言前綴,可以使用說明符%#o、%#x、%#X分別生成0、0x和0X前綴。注意(o非0);
其它整數類型
short int 類型:可能占用比int類型更少的存儲空間,是一種有符號類型。
long int 類型:可能占用比int類型更多的存儲空間,是一種有符號類型。
long long int類型:可能占用比long類型更多的存儲空間,是一種有符號類型。(C99中引入)
unsigned int類型:只能表示非負值,可以表示更大的數值。
C90中引入了unsigned long int和unsigned short int。
C99中引入了unsigned long long int。
單獨的unsigned等價於unsigned int。
如果是在long類型等於int類型的系統中編寫代碼,當確實需要32位整數時,應使用long類型,以便程序移植到16位機器上后仍然可以正常工作。
使用short類型可以節省存儲空間,此外計算機中的一些硬件寄存器是16位的。
整數溢出的時候將從最小值開始。
如果希望把一個較小的常量作為long類型對待,可以使用l或L后綴。同理ll或LL適用於long long。ull,LLU,Ull用於標識unsigned long long。
要打印unsigned int數字可以使用%u符號。打印long數值,可以使用%ld格式說明符。對short類型可以使用h前綴。
在C中常量后綴可以使用大寫和小寫,但格式說明符只能使用小寫字母。
char類型
char類型用於存儲字母和標點符號之類的字符,char類型實際存儲的是整數而不是字符(特定的整數表示特定的字符,ASCII碼中65表示A,97表示a)。
C把一個字節定義為char類型使用的位數。
‘A’,單引號中的一個字符是C的一個字符常量。不使用單引號會將其視為一個變量名,使用雙引號,會視為一個字符串。
使用ASCII碼時要注意數字和數字字符的區別。字符4的ASCII碼值為52,寫法‘4’表示符號4而不是數值4。
一些C實現把char當作有符號類型,另一些則當作無符號類型,可以通過limits.h頭文件檢查這一信息。
_Bool類型
C99中引入,實際上是一種整數類型,僅需要1位來進行存儲。
float、double和long double類型
float類型必須至少能表示6位有效數字。double類型必須至少能表示10位有效數字。
一個浮點常量最基本的形式是:包含小數點的一個帶符號的數字序列,接着是字母e或E,然后是代表10的指數的一個有符號值。例如-1.56E+12,2.87e-3。
可以省略正號,可以沒有小數點或指數部分,但不能同時沒有二者,在浮點常量中不要使用空格。
默認情況下,編譯器將浮點常量當作double類型。你可以通過f或F后綴使編譯器把浮點常量當作float類型。
C99為表示浮點常量添加了一種十六進制格式。前綴使用0X/0x,接着十六進制數字,然后是p/P,最后是2的指數。
例如0xa.1fp10。啊是10,.1f表示1/16加上15/256,p10表示2的10次方。十進制為10364.0。
float和double類型的輸出都使用%f,%e,%a說明符。(a代替e)
類型大小
C的內置運算符sizeof以字節為單位給出類型的大小。例如printf("int has a size of %u bytes.\n",sizeof(int))。
因為C把char類型的長度定義為1個字節,所以在char類型長為16位,double類型長為64位的系統中,sizeof將報告double類型有4字節長。
3.5使用數據類型
C語言對待類型不匹配現象更寬容,C編譯器允許二次初始化,但是會給出警告。
當為某個數值類型的變量進行初始化時,如果使用了其它類型的值,C會自動對該值進行類型轉換以便和變量類型匹配,但可能丟失部分數據。
使用%d顯示float值不會把該float值轉換為近似的int值,而是顯示垃圾值。類似,使用%f顯示int值也不會把該int值轉換為浮點值。
3.6刷新輸出
printf()語句將輸出傳遞給一個被稱為緩沖區的中介存儲區域,緩沖區的內容再不斷地被傳遞給屏幕。
標准C規定在以下幾種情況將緩沖區內容傳遞給屏幕
1.緩沖區滿的時候2遇到換行符的時候3需要輸入的時候。
將緩沖區內容傳遞給屏幕或文件稱為刷新緩沖區。
question:假設ch為char類型變量。使用轉義序列、十進制值、八進制字符常量以及十六進制字符常量等方法將其賦值為回車符。(假設使用ASCII編碼值)
answer:ch='\r';ch=13;ch='\015';ch='\xd';
