int類型
int類型的值必須是整數(正負整數、0),儲存一個int要占用一個 機器字長(目前用32位儲存一個int,未來處理器發展到64位后能儲存更大的整數)。
1.聲明int變量
方法:先寫上int,然后寫變量名,最 后加上一個分號。
若要聲明多個變量,可以單獨聲明每個變量,也可在int后面 列出多個變量名,變量名之間用逗號分隔。如:
int erns;
int hogs, cows, goats;
變量如何獲得值:
1.賦值,如
cows = 112;
2.通過函數獲得值,如
scanf()
2.初始化變量
def:為變量賦一個初始值。
--->可以直接在聲明中完成。只需在變量名后面加上賦值運算符(=)和待賦 給變量的值即可。如:
int hogs = 21;
int cows = 32, goats = 14;
int dogs, cats = 94; /* 有效,但是這種格式很糟糕 */
該示例的最后一行,只初始化了cats,並未初始化dogs。這種寫法很 容易讓人誤認為dogs也被初始化為94,所以最好不要把初始化的變量和未初 始化的變量放在同一條聲明中。
==》簡而言之,聲明為變量創建和標記存儲空間,並為其指定初始值。
3.int類型常量
整型常量或整型字面量:如21,65,94等
C語言把不含小數點和指數的數作為整數;把大多數整型常量視為int類型,但是非常大的整數除外。
4.打印int值
--->可以使用printf()函數打印int類型的值。
%d稱為轉換說明,它指定了printf()應使用什么格式來顯示一個值。
格式化字符串(def:使用Format函數將指定的字符串轉換為想要的輸出格式)中的每個%d都與待打印變量列表中相應的int 值匹配。這個值可以是int類型的變量、int類型的常量或其他任何值為int類型的表達式。
//程序清單3.2 print1.c程序
/* print1.c - 演示printf()的一些特性 */
#include <stdio.h>
int main(void)
{
int ten = 10;
int two = 2;
printf("Doing it right: ");
printf("%d minus %d is %d\n", ten, 2, ten - two);
printf("Doing it wrong: ");
printf("%d minus %d is %d\n", ten); // 遺漏2個參數
return 0;
}
!!-- printf()函數的參數數目不定,所以使用printf()函數時,要確保轉換說 明的數量與待打印值的數量相等。
5.八進制和十六進制
==》因為8和16都是2的冪,而10卻不是。顯然,八進制 和十六進制記數系統在表達與計算機相關的值時很方便。
在C語言中,用特定的前綴表示使用哪種進制。0x或0X前綴表示十六進 制值,所以十進制數16表示成十六進制是0x10或0X10。與此類似,0前綴表 示八進制。例如,十進制數16表示成八進制是020。
使用不同的進制數是為了方便,不會影響數被儲存的方式。也 就是說,無論把數字寫成16、020或0x10,儲存該數的方式都相同,因為計算機內部都以二進制進行編碼。
6.顯示八進制和十六進制
在C程序中,既可以使用和顯示不同進制的數。不同的進制要使用不同 的轉換說明。以十進制顯示數字,使用%d;以八進制顯示數字,使用%o; 以十六進制顯示數字,使用%x。另外,要顯示各進制數的前綴0、0x和0X, 必須分別使用%#o、%#x、%#X。
//程序清單3.3 bases.c程序
/* bases.c--以十進制、八進制、十六進制打印十進制數100 */
#include <stdio.h>
int main(void)
{
int x = 100;
printf("dec = %d; octal = %o; hex = %x\n", x, x, x);
printf("dec = %d; octal = %#o; hex = %#x\n", x, x, x);
return 0;
}
該程序以3種不同記數系統顯示同一個值。printf()函數做了相應的轉 換。注意,如果要在八進制和十六進制值前顯示0和0x前綴,要分別在轉換 說明中加入#。
char類型
char類型用於儲存字符(如,字母或標點符號),但是從技術層面看, char是整數類型。因為char類型實際上儲存的是整數而不是字符。
計算機使用數字編碼來處理字符,即用特定的整數表示特定的字符。
如,在ASCII碼中,整數65代表大寫字母A。
1.聲明char類型變量
char類型變量的聲明方式與其他類型變量的聲明方式相同。如:
char response;
char itable, latan;
2.字符常量和初始化
(ASCII 碼)
char grade = 'A';
在C語言中,用單引號括起來的單個字符被稱為字符常量。編譯器一發現'A',就會將其轉換成相應的代碼值。單引號必不可少。
char broiled; /* 聲明一個char類型的變量 */
broiled = 'T'; /* 為其賦值,正確 */
broiled = T; /* 錯誤!此時T是一個變量 */
broiled = "T"; /* 錯誤!此時"T"是一個字符串 */
!!—C語言將字符常量視為int類型而非char類型。
3.非打印字符
單引號只適用於字符、數字和標點符號。瀏覽ASCII表會發現,有些 ASCII字符打印不出來。例如,一些代表行為的字符(如,退格、換行、終 端響鈴或蜂鳴)。C語言提供了3種方法表示這些字符。
1.使用ASCII碼。例如,蜂鳴字符的ASCII值是 7,因此可以這樣寫:
char beep = 7;
2.使用特殊的符號序列表示一些特殊的字符。這些符號序列叫作轉義序列。
如下表:轉義序列及含義
\a:警報字符
\b、\f、\n、\r、\t和\v:常用的輸出設備控制字符
\、'、":用於打印\、'、"字符
!!—使用ASCII碼時,注意數字和數字字符的區別。例如,字符4對應的 ASCII碼是52。'4'表示字符4,而不是數值4。
4.打印字符
printf()函數用%c指明待打印的字符。
程序清單3.5演示了打印char類型變量的兩種方式。
//程序清單3.5 charcode.c程序
/* charcode.c-顯示字符的代碼編號 */
#include <stdio.h>
int main(void)
{
char ch;
printf("Please enter a character.\n");
scanf("%c", &ch); /* 用戶輸入字符 */
printf("The code for %c is %d.\n", ch, ch);
return 0;
}
5.有符號還是無符號
在關鍵字char前面使用signed或unsigned。無論編譯器默認char是什么類型,signed char表示有符號類型,而 unsigned char表示無符號類型。這在用char類型處理小整數時很有用。如果只用char處理字符,那么char前面無需使用任何修飾符。
float、double和long double
==》C語言中的浮點類型有float、double和long double 類型。它們與FORTRAN和Pascal中的real類型一致。
浮點數的表示類似於科學記數法:
第1列是一般記數法;第2列是科學記數法;第3列是指數記數法(或稱為e記數法)
C標准規定:
float類型必須至少能表示6位有效數字,且取值范圍至少是 10-37~10+37;C語言提供的另一種浮點類型是double(意為雙精度)
double類型和float類型的最小取值范圍相同,但至少必須能表示10位有效數字。
第3種浮點類型是long double,以滿足比double類型更高的精度要求。不過,C只保證long double類型至少與double類型的精度相同。
1.聲明浮點型變量
浮點型變量的聲明和初始化方式與整型變量相同。如:
float noah, jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
2.浮點型常量
浮點型常量的基本形式:有符號的數字(包括小數點),后面緊跟e或E,最后是一個有符號數表示10的指數。如:
-1.56E+12
2.87e-3
正號可以省略。可以沒有小數點(如,2E5)或指數部分(如, 19.28),但是不能同時省略兩者。
可以省略小數部分(如,3.E16)或整數 部分(如,.45E-6),但是不能同時省略兩者。
--->更多有效浮點型常量栗子:
3.14159
.2
4e16
.8E-5
!!:不要在浮點型常量中間加空格。
3.打印浮點值
一些特性:
printf()函數使用%f轉換說明打印十進制記數法的float和double類型浮點數,用%e打印指數記數法的浮點數。
打印long double類型要使用%Lf、%Le或%La 轉換說明。
給那些未在函數原型中顯式說明參數類型的函數(如,printf())傳遞參數時,C編譯器會把float類型的值自動轉換成double類型。
//程序清單3.7 showf_pt.c程序
/* showf_pt.c -- 以兩種方式顯示float類型的值 */
#include <stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
// 下一行要求編譯器支持C99或其中的相關特性
printf("And it's %a in hexadecimal, powers of 2 notation\n",
aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be written %Le\n", dip, dip);
return 0;
}
4.浮點值的上溢和下溢
計算導致數字過大,超過當前類型能表達的范圍時,就會發生上溢。如:
設3.4E38為系統最大float類型值:
float toobig = 3.4E38 * 100.0f;
printf("%e\n", toobig);
以十進制為例,把一個有4位有效數字的數(如,0.1234E-10)除以10,
得到:0.0123E-10。
雖然得到了結果,但是在計算過程中卻損失了原末尾有效位上的數字。這種情況叫 作下溢。
特殊的浮點值:NaN(not a number的縮寫)
如:給asin() 函數傳遞一個值,該函數將返回一個角度,該角度的正弦就是傳入函數的值。
但是正弦值不能大於1,因此,如果傳入的參數大於1,該函數的行為是 未定義的。在這種情況下,該函數將返回NaN值,printf()函數可將其顯示為 nan、NaN或其他類似的內容。
浮點數舍入錯誤
/* floaterr.c--演示舍入錯誤 */
#include <stdio.h>
int main(void)
{
float a,b;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
printf("%f \n", a);
return 0;
}
原因:計算機缺少足夠的小數位來完成正確的運算。
3.11編程練習
- 編寫一個程序,發出一聲警報,然后打印下面的文本:
Startled by the sudden sound, Sally shouted,
"By the Great Pumpkin, what was that!"
#include <stdio.h>
int main(void)
{
printf("\a");
printf("Startled by the sudden sound, ");
printf("Sally shouted,\n");
printf("\"By the Great Pumpkin, what was that!\"\n");
return 0;
}
- 1個水分子的質量約為3.0×10 −23克。1誇脫水大約是950克。編寫一個程序,提示用戶輸入水的誇脫數,並顯示水分子的數量。
#include <stdio.h>
#define MASS_PER_MOLE 3.0e-23
#define MASS_PER_QUART 950
int main(void)
{
double quart, molecules;
printf("Please enter a quart for water:");
scanf("%lf", &quart);
//1誇脫水大約是950克;
//1個水分子質量約為3.0 * 10^(-23)克;
molecules = quart * MASS_PER_QUART / MASS_PER_MOLE;
printf("%g quart water includes %e water molecules.\n", quart, molecules);
return 0;
}