?? 3.txt
字號:
-32768
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
【例3.4】
main(){
long x,y;
int a,b,c,d;
x=5;
y=6;
a=7;
b=8;
c=x+a;
d=y+b;
printf("c=x+a=%d,d=y+b=%d\n",c,d);
}
從程序中可以看到:x, y是長整型變量,a, b是基本整型變量。它們之間允許進行運算,運算結果為長整型。但c,d被定義為基本整型,因此最后結果為基本整型。本例說明,不同類型的量可以參與運算并相互賦值。其中的類型轉換是由編譯系統自動完成的。有關類型轉換的規則將在以后介紹。
3.4 實型數據
3.4.1 實型常量的表示方法
實型也稱為浮點型。實型常量也稱為實數或者浮點數。在C語言中,實數只采用十進制。它有二種形式:十進制小數形式,指數形式。
1) 十進制數形式:由數碼0~ 9和小數點組成。
例如:
0.0、25.0、5.789、0.13、5.0、300.、-267.8230
等均為合法的實數。注意,必須有小數點。
2) 指數形式:由十進制數,加階碼標志“e”或“E”以及階碼(只能為整數,可以帶符號)組成。
其一般形式為:
a E n(a為十進制數,n為十進制整數)
其值為 a*10n。
如:
2.1E5 (等于2.1*105)
3.7E-2 (等于3.7*10-2)
0.5E7 (等于0.5*107)
-2.8E-2 (等于-2.8*10-2)
以下不是合法的實數:
345 (無小數點)
E7 (階碼標志E之前無數字)
-5 (無階碼標志)
53.-E3 (負號位置不對)
2.7E (無階碼)
標準C允許浮點數使用后綴。后綴為“f”或“F”即表示該數為浮點數。如356f和356.是等價的。
【例3.5】說明了這種情況。
main(){
printf("%f\n ",356.);
printf("%f\n ",356);
printf("%f\n ",356f);
}
3.4.2 實型變量
1. 實型數據在內存中的存放形式
實型數據一般占4個字節(32位)內存空間。按指數形式存儲。實數3.14159在內存中的存放形式如下:
+ .314159 1
數符 小數部分 指數
? 小數部分占的位(bit)數愈多,數的有效數字愈多,精度愈高。
? 指數部分占的位數愈多,則能表示的數值范圍愈大。
2. 實型變量的分類
實型變量分為:單精度(float型)、雙精度(double型)和長雙精度(long double型)三類。
在Turbo C中單精度型占4個字節(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。雙精度型占8 個字節(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
類型說明符 比特數(字節數) 有效數字 數的范圍
float 32(4) 6~7 10-37~1038
double 64(8) 15~16 10-307~10308
long double 128(16) 18~19 10-4931~104932
實型變量定義的格式和書寫規則與整型相同。
例如:
float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
3. 實型數據的舍入誤差
由于實型變量是由有限的存儲單元組成的,因此能提供的有效數字總是有限的。如下例。
【例3.6】實型數據的舍入誤差。
main()
{float a,b;
a=123456.789e5;
b=a+20
printf("%f\n",a);
printf("%f\n",b);
}
注意:1.0/3*3的結果并不等于1。
【例3.7】
main()
{
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("%f\n%f\n",a,b);
}
? 從本例可以看出,由于a 是單精度浮點型,有效位數只有七位。而整數已占五位,故小數二位后之后均為無效數字。
? b 是雙精度型,有效位為十六位。但Turbo C 規定小數后最多保留六位,其余部分四舍五入。
3.4.3 實型常數的類型
實型常數不分單、雙精度,都按雙精度double型處理。
3.5 字符型數據
字符型數據包括字符常量和字符變量。
3.5.1 字符常量
字符常量是用單引號括起來的一個字符。
例如:
'a'、'b'、'='、'+'、'?'
都是合法字符常量。
在C語言中,字符常量有以下特點:
1) 字符常量只能用單引號括起來,不能用雙引號或其它括號。
2) 字符常量只能是單個字符,不能是字符串。
3) 字符可以是字符集中任意字符。但數字被定義為字符型之后就不能參與數值運算。如'5'和5 是不同的。'5'是字符常量,不能參與運算。
3.5.2 轉義字符
轉義字符是一種特殊的字符常量。轉義字符以反斜線"\"開頭,后跟一個或幾個字符。轉義字符具有特定的含義,不同于字符原有的意義,故稱“轉義”字符。例如,在前面各例題printf函數的格式串中用到的“\n”就是一個轉義字符,其意義是“回車換行”。轉義字符主要用來表示那些用一般字符不便于表示的控制代碼。
常用的轉義字符及其含義
轉義字符 轉義字符的意義 ASCII代碼
\n 回車換行 10
\t 橫向跳到下一制表位置 9
\b 退格 8
\r 回車 13
\f 走紙換頁 12
\\ 反斜線符"\" 92
\' 單引號符 39
\” 雙引號符 34
\a 鳴鈴 7
\ddd 1~3位八進制數所代表的字符
\xhh 1~2位十六進制數所代表的字符
廣義地講,C語言字符集中的任何一個字符均可用轉義字符來表示。表中的\ddd和\xhh正是為此而提出的。ddd和hh分別為八進制和十六進制的ASCII代碼。如\101表示字母"A" ,\102表示字母"B",\134表示反斜線,\XOA表示換行等。
【例3.8】轉義字符的使用。
main()
{
int a,b,c;
a=5; b=6; c=7;
printf(“ ab c\tde\rf\n”);
printf(“hijk\tL\bM\n”);
}
3.5.3 字符變量
字符變量用來存儲字符常量,即單個字符。
字符變量的類型說明符是char。字符變量類型定義的格式和書寫規則都與整型變量相同。例如:
char a,b;
3.5.4 字符數據在內存中的存儲形式及使用方法
每個字符變量被分配一個字節的內存空間,因此只能存放一個字符。字符值是以ASCII碼的形式存放在變量的內存單元之中的。
如x的十進制ASCII碼是120,y的十進制ASCII碼是121。對字符變量a,b賦予'x'和'y'值:
a='x';
b='y';
實際上是在a,b兩個單元內存放120和121的二進制代碼:
a:
0 1 1 1 1 0 0 0
b:
0 1 1 1 1 0 0 1
所以也可以把它們看成是整型量。C語言允許對整型變量賦以字符值,也允許對字符變量賦以整型值。在輸出時,允許把字符變量按整型量輸出,也允許把整型量按字符量輸出。
整型量為二字節量,字符量為單字節量,當整型量按字符型量處理時,只有低八位字節參與處理。
【例3.9】向字符變量賦以整數。
main()
{
char a,b;
a=120;
b=121;
printf("%c,%c\n",a,b);
printf("%d,%d\n",a,b);
}
本程序中定義a,b為字符型,但在賦值語句中賦以整型值。從結果看,a,b值的輸出形式取決于printf函數格式串中的格式符,當格式符為"c"時,對應輸出的變量值為字符,當格式符為"d"時,對應輸出的變量值為整數。
【例3.10】
main()
{
char a,b;
a='a';
b='b';
a=a-32;
b=b-32;
printf("%c,%c\n%d,%d\n",a,b,a,b);
}
本例中,a,b被說明為字符變量并賦予字符值,C語言允許字符變量參與數值運算,即用字符的ASCII 碼參與運算。由于大小寫字母的ASCII 碼相差32,因此運算后把小寫字母換成大寫字母。然后分別以整型和字符型輸出。
3.5.5 字符串常量
字符串常量是由一對雙引號括起的字符序列。例如: "CHINA" , “C program” , "$12.5" 等都是合法的字符串常量。
字符串常量和字符常量是不同的量。它們之間主要有以下區別:
1) 字符常量由單引號括起來,字符串常量由雙引號括起來。
2) 字符常量只能是單個字符,字符串常量則可以含一個或多個字符。
3) 可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。在C語言中沒有相應的字符串變量。這是與BASIC 語言不同的。但是可以用一個字符數組來存放一個字符串常量。在數組一章內予以介紹。
4) 字符常量占一個字節的內存空間。字符串常量占的內存字節數等于字符串中字節數加1。增加的一個字節中存放字符"\0" (ASCII碼為0)。這是字符串結束的標志。
例如:
字符串 "C program" 在內存中所占的字節為:
C p r o g r a m \0
字符常量'a'和字符串常量"a"雖然都只有一個字符,但在內存中的情況是不同的。
'a'在內存中占一個字節,可表示為:
a
"a"在內存中占二個字節,可表示為:
a \0
3.6 變量賦初值
在程序中常常需要對變量賦初值,以便使用變量。語言程序中可有多種方法為變量提供初值。本小節先介紹在作變量定義的同時給變量賦以初值的方法。這種方法稱為初始化。在變量定義中賦初值的一般形式為:
類型說明符 變量1= 值1,變量2= 值2,……;
例如:
int a=3;
int b,c=5;
float x=3.2,y=3f,z=0.75;
char ch1='K',ch2='P';
應注意,在定義中不允許連續賦值,如a=b=c=5是不合法的。
【例3.11】
main()
{
int a=3,b,c=5;
b=a+c;
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
3.7 各類數值型數據之間的混合運算
變量的數據類型是可以轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。自動轉換發生在不同數據類型的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則:
1) 若參與運算量的類型不同,則先轉換成同一類型,然后進行運算。
2) 轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型后再進行運算。
3) 所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。
4) char型和short型參與運算時,必須先轉換成int型。
5) 在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。
下圖表示了類型自動轉換的規則。
【例3.12】
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -