目錄:
2.1 常量與變量
-
2.1.1 常量
-
2.1.2 變量
2.2 簡單的屏幕輸出
2.3 數據類型
2.4 如何計算變量或數據類型所占內存空間的大小
2.5 變量的賦值和賦值運算符
2.6 本章擴充內容
2.7 本章知識點小結
2.8 本章常見錯誤小結
2.1.1 常量
| 不同類型的整型常量 | 實例 | 特點 |
| 有符號整型常量 | 10,-30,0 | 默認的int型定義為有符號整數,因此對int型無須使用signed |
| 無符號整型常量 | 30u, 256U |
無符號整型常量由常量值后跟U或u來表示,不能表示成小於0的數,如-30u就是不合法的 |
| 長整型常量 | -256l,1024L | 長整型常數由常數值后跟L或l來表示 |
| 無符號長整型常量 | 30lu | 無符號長整型常量由常數值后跟LU、Lu、lU或lu來表示 |
| 不同類型的實型常量 | 實例 | 特點 |
| 單精度實型常量 | 1.25F,1.25e-2f | 單精度實型常量由常量值后跟F或f來表示 |
| 雙精度實型常量 | 0.123,-12.35,.98 | 實型常量隱含按雙精度型處理 |
| 長雙精度實型常量 | 1.25L | 長雙精度型常量由常量值后跟L或l來表示 |
2.1.2 變量
- 定義變量的一般形式:類型關鍵字 變量名;
- 關鍵字(Keyword):C語言預先規定的、具有特殊意義的單詞
int main(void) { int a; //用關鍵字int指定變量a的類型 float b; //用關鍵字float指定變量b的類型 char c; //用關鍵字char指定變量c的類型 a=1; //為int型變量a賦值整型變量1 b=2.5; //為float型變量b賦值實型變量2.5 c='A'; //為char型變量c賦值字符型變量'A' return 0; }
- 一個C 程序必須且只能有一個用main作為名字的函數,這個函數成為主函數;main后面圓括號內的void表示它沒有函數參數;main前面的int表示函數執行后會返回操作系統一個整數型,在main函數的函數體中的最后一條語句使用return語句返回了這個值,通常返回0表示程序正常結束。
- C語言允許在定義變量的同時對變量初始化(為其賦初值):
int main(void) { int a=1; //定義整型變量a並對其初始化 float b=2.5; //定義實型變量b並對其初始化 char c='A'; //定義字符型變量c並對其初始化 return 0; }
- 如果定義了一個變量,但未對其進行初始化,那么該變量的值是一個隨機數(靜態變量和全局變量除外)
- 跨行注釋:
#include<stdio.h> #include<stdlib.h> int main() { printf("char %d\n",sizeof(char)); printf("int %d\n",sizeof(int)); printf("short int %d\n",sizeof(short)); /*若一行寫不完注釋 可以用這樣的方法寫多行注釋 */ return 0; }
- 在一條語句中,可同時定義多個相同類型的變量,多個變量之間用逗號作分隔符,其書寫的先后順序無關緊要。
//定義三個整型變量: int a,b,c; //在定義變量的同時將其初始化為0: int a=0,b=0,c=0; //但是不能寫成: int a=b=c=0;
2.2 簡單的屏幕輸出
#include<stdio.h> int main(void) { int a=1; float b=2.5; char c='A'; printf("a=%d\n",a); //按整型格式輸出變量a的值 printf("b=%f\n",b); //按實數格式輸出變量b的值 printf("c=%c\n",c); //按字符串格式輸出變量c的值 printf("End of program\n"); //輸出一個字符串 return 0; } 會輸出: a=1 b=2.500000 c=A End of program
- 程序第一行以#開頭而未以分號結尾的不是C語句,而是C的編譯預處理命令;尖括號內的文件稱為頭文件,h為head之意,std為standard之意,i為input之意,o為output之意;編譯預處理命令#include可使頭文件在程序中生效,它的作用是:將寫在尖括號內的輸入/輸出函數的頭文件stdio.h包含到用戶源文件中。
- 格式字符詳解:
1.d格式字符
功能:用來輸出十進制數
格式:%d:按整型數據的實際長度輸出
%md:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%ld:輸出長整型數據。2.o格式字符
功能:以八進制形式輸出整數;
格式:%o:按整型數據的實際長度輸出
%mo:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%lo:輸出長整型數據。3.x格式字符
功能:以十六進制形式輸出整數
格式:%x:按整型數據的實際長度輸出
%mx:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%lx:輸出長整型數據。4.u格式字符
功能:以十進制數輸出無符號整數
格式:%u:按整型數據的實際長度輸出
%mu:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%lu:輸出長整型數據。5.c格式字符
功能:輸出單個字符
格式:%c:按整型數據的實際長度輸出
%mc:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%lc:輸出長整型數據。6.s格式字符
功能:輸出字符串
格式:%s:按整型數據的實際長度輸出
%ms:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%ls:輸出長整型數據。7.f格式字符
功能:以小數形式輸出單、雙精度實數
格式:%f:按整型數據的實際長度輸出
%mf:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%lf:輸出長整型數據。8.e格式字符
功能:以指數形式輸出單、雙精度實數
格式:%e:按整型數據的實際長度輸出
%me:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%le:輸出長整型數據。9.g格式字符
功能:以%f、%e中較短的輸出寬度輸出單、雙精度實數
格式:%g:按整型數據的實際長度輸出
%mg:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補一空格;若大於m,則按實際位數輸出。
%lg:輸出長整型數據。 - 字符串:用一對雙引號括起來的若干字符。
2.3 數據類型

| 數據類型分類 | 關鍵字 | 變量聲明實例 | 詳細章節 | ||
| 基 本 類 型 |
整型 | 基本整型 | int | int a; | 第2章 第4章 |
| 長整型 | long | long int a; 或者 long a; | |||
| 長長整型 | long long | long long int a;或者 long long a; | |||
| 短整型 | short | short int a; 或者 short a; | |||
| 無符號整型 | unsigned | unsigned int a; unsigned long a; unsigned short a; |
|||
| 實型 (浮點型) |
單精度實型 | float | float a; | ||
| 雙精度整型 | double | double a; | |||
| 長雙精度整型 | long double | long double a; | |||
| 字符型 | char | char a; | 第4章 第10章 |
||
| 枚舉類型 | enum | enum response{no,yes,none}; enum response answer; |
第12章 | ||
| 構 造 類 型 |
數組 | — | int score[10]; char name[20]; |
第8章 | |
| 結構體 | struct | struct date { int year; int month; int day; }; struct date d; |
第12章 | ||
| 共用體 | union | union { int single; char spouseName[20]; struct date divorcedDay; }married; |
|||
| 指針類型 | — | int * ptr; char * pStr; |
第9~11章 | ||
| 無類型 | void | void Sort(int array[] , int n); void *malloc(unsigned int size); |
第8章 第11章 |
||
- 定義整型變量時,只要不指定為無符號型,其隱含的類型就是有符號型,而signed通常是省略不寫的。
2.4 如何計算變量或數據類型所占內存空間的大小
- 一個字節(Byte)可以表示的整數最小為0,最大為255,一個字節等於8個二進制位(bit),也稱比特。bit是binary digit二進制數的縮寫,位是衡量物理存儲器容量的最小單位。
| 英文稱謂 | 中文稱謂 | 字節大小 | 換算方法 |
| 1b(bite) | 比特 | ||
| 1B(Byte) | 字節 | 一個字節 | 1B=8bit |
| 1KB(Kilobyte) | K | 一千字節 | 1KB=1024B=210B |
| 1MB(Megabyte) | 兆 | 百萬字節 | 1MB=1024KB=220B |
| 1GB(Gigabyte) | 吉 | 十億字節,又稱“千兆” | 1GB=1024MB=230B |
| 1TB(Terabyte) | 太 | 萬億字節 | 1TB=1024GB=240B |
| 1PB(Petabyte) | 拍 | 千萬億字節 | 1PB=1024TB=250B |
| 1EB(Exabyte) | 艾 | 百億億字節 | 1EB=1024PB=260B |
| 1ZB(Zettabyte) | 澤 | 十萬億億字節 | 1ZB=1024EB=270B |
| 1YB(Yottabyte) | 堯 | 一億億億字節 | 1YB=1024ZB=280B |
| 1BB(Brontobyte) | 一千億億億字節 | 1BB=1024YB=290B | |
| 1NB(Nonabyte) | 一百萬億億億字節 | 1NB=1024BB=2100B | |
| 1DB(Doggabyte) | 十億億億億字節 | 1DB=1024NB=2110B |
#include<stdio.h> int main(void) { printf("Data type Number of bytes\n"); printf("---------- -----------------\n"); printf("char %d\n",sizeof(char)); printf("int %d\n",sizeof(int)); printf("short int %d\n",sizeof(short)); printf("long int %d\n",sizeof(long)); printf("long long int %d\n",sizeof(long long)); printf("float %d\n",sizeof(float)); printf("double %d\n",sizeof(double)); printf("long double %d\n",sizeof(long double)); return 0; }
輸出:
Data type Number of bytes
---------- -----------------
char 1
int 4
short int 2
long int 4
long long int 8
float 4
double 8
long double 16
- 注:這個程序在不同的操作系統和編譯環境下的運行結果可能有所差異。
2.5 變量的賦值和賦值運算符
- 在計算含有不同類型運算符的表達式時,要考慮運算符的優先級,根據優先級確定運算的順序,即先執行優先級高的運算,然后執行優先級低的運算。
- 運算符的結合性:一種是左結合,即自左向右計算;另一種是右結合,即自右向左計算。
C語言中需要兩個操作數的算術運算符是左結合的,例如:x/y*z=(x/y)*z。
而賦值運算符則是右結合的,例如:a=b=c=0;與a=(b=(c=0));是等價的<多重賦值>。
2.6 本章擴充內容
- 有符號整數和無符號整數
有符號整數和無符號整數的區別在於怎樣解釋整數的最高位。對於無符號整數,其最高位被C編譯器解釋為數據位。而對於有符號整數,C編譯器將其最高位解釋為符號位,若符號位為0,則表示該數為正數;若符號位為1,則表示該數為負數。
- 原碼:將一個整數換算成二進制,就是其原碼。
- 反碼:正數的反碼就是其原碼,負數的反碼是除符號位每一位取反(即0變1,1變0)。
- 補碼:正數的補碼就是其原碼,負數的反碼+1就是其補碼。
例:(“┊”前為符號位)
-1的原碼
| 1┊0 | 00 | 00 | 00 | 00 | 00 | 00 | 01 | |
-1的反碼
| 1┊1 | 11 | 11 | 11 | 11 | 11 | 11 | 10 |
-1的補碼
| 1┊1 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
如圖所示,如果將最高位解釋為符號位(有符號豎數),則該數為-1;如果將最高位解釋為數據位(無符號數),那么該數就是1*20+1*21+1*22+1*23+1*24+1*25+1*26+1*27+1*28+1*29+1*210+1*211+1*212+1*213+1*214+1*215=65535
- 在計算機內存中用補碼表示負數的原因:首先,可以將減法運算轉化為加法運算來處理。eg.將7-6轉化為(+7)+(-6)來處理;其次,可以用統一的形式來表示0(否則會出現+0和-0),+0和-0的原碼不同,補碼相同。
2.實型數據在內存中的存儲格式
對於實數,無論是小數表示形式還是指數表示形式,在計算機內部都采用浮點形式來儲存。
浮點形式是相對於定點形式而言的。所謂定點數是指小數點位置是固定的,小數點位於符號位和第一個數值位之間,它表示的是純小數;整型數據是定點表示的特例,只不過它的小數點的位置在數值位之后而已。
所謂浮點數是指小數點的位置是可以浮動的數。例如,十進制數1234.56可以寫成:1234.56 0.123456*104 1.23456*103 或者 12345.6*10-1,這里隨着10的指數的變化,小數點的位置也會發生相應的變化。
通常,浮點數是將實數分為階碼和尾數兩部分來表示。例如,實數N可以表示為:N=S*rj. 其中,S為尾數(正負均可),一般規定用純小數形式;j為階碼(正負均可,但必須是整數);r是基數,對二進制數而言,r=2,即N=S*2j。例如:10.0111=0.100111*210。
浮點數在計算機中的存儲格式如圖所示:
| 階碼j | 尾數S | ||
| 階碼符號 | 階碼的數值 | 尾數符號 | 尾數的數值 |
- 階碼:實數的指數部分;尾數:小數部分。
- 階碼所占的 位數決定實數的表數范圍;尾數所占的位數決定實數的精度,尾數的符號決定實數的正負。
- 浮點表示法的表數范圍遠遠大於定點表示法,而且也更靈活。
3.單精度實型和雙精度實型的有效位數
//將同一實型數分別賦值給單精度實型和雙精度實型變量,然后打印輸出
#include<stdio.h> int main(void) { float a; double b; a=123456.789e4; b=123456.789e4; printf("%f\n%f\n",a,b); return 0; }
輸出:
1234567936.000000
1234567890.000000
- 原因:單精度實型(float型)變量和雙精度實型(double型)變量所接收的實型變量的有效數字位數不同。一般而言,double型變量可以接收實型常量的16位有效數字,而float型變量僅能接收實型常量的7位有效數字,在有效數字后面輸出的數字都是不准確的。因此,將double型數據賦值給float型變量時有可能發生數據截斷錯誤,從而產生舍入誤差。
2.7 本章知識點小結
略
2.8 本章常見錯誤小結
| 常見錯誤實例 | 常見錯誤描述 | 錯誤類型 |
| — | 變量未定義就使用 | 編譯錯誤 |
| int newValue; newvalue=0; |
忽略了變量區分大小寫,使得定義的變量和使用的變量不 同名 |
編譯錯誤 |
| printf=("Input n:") int n; |
在可執行語句之后定義變量 | 編譯錯誤 |
| int n=3.5 | 在定義變量時,用於變量初始化的常量類型與定義的變量 類型不一致 |
有的編譯器 不提示錯誤 |
| int m=n=0; | 在定義變量時,對多個變量進行連續賦初值 | 編譯錯誤 |
