《C語言程序設計》第二章 基本數據類型


目錄:

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  變量

auto :聲明自動變量
break:跳出當前循環
case:開關語句分支
char :聲明字符型變量或函數返回值類型
const :聲明只讀變量
continue:結束當前循環,開始下一輪循環
default:開關語句中的“默認”分支
do :循環語句的循環體
double :聲明雙精度浮點型變量或函數返回值類型
else :條件語句否定分支(與 if 連用)
enum :聲明枚舉類型
extern:聲明變量或函數是在其它文件或本文件的其他位置定義
float:聲明浮點型變量或函數返回值類型
for:一種循環語句
goto:無條件跳轉語句
if:條件語句
int: 聲明整型變量或函數
long :聲明長整型變量或函數返回值類型
register:聲明寄存器變量
return :子程序返回語句(可以帶參數,也可不帶參數)
short :聲明短整型變量或函數
signed:聲明有符號類型變量或函數
sizeof:計算數據類型或變量長度(即所占字節數)
static :聲明靜態變量
struct:聲明結構體類型
switch :用於開關語句
typedef:用以給數據類型取別名
unsigned:聲明無符號類型變量或函數
union:聲明共用體類型
void :聲明函數無返回值或無參數,聲明無類型指針
volatile:說明變量在程序執行中可被隱含地改變
while :循環語句的循環條件
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  本章擴充內容

  1. 有符號整數和無符號整數

有符號整數和無符號整數的區別在於怎樣解釋整數的最高位。對於無符號整數,其最高位被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; 在定義變量時,對多個變量進行連續賦初值 編譯錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM