1. 程式人生 > >C語言複習————基本資料型別、運算子和表示式

C語言複習————基本資料型別、運算子和表示式

資料型別/運算子/表示式

主要分兩部分介紹,第一部分介紹常用的資料型別,例如:常量和變數/整型/實型/字元型;第二部分介紹算數運算子和算數表示式以及賦值運算子和逗號運算子。

一. 常用的資料型別

1. C語言中的資料型別

C語言中基本資料型別主要有整型/實型/字元型/字串型,本節主要介紹這幾種基本的資料型別,以及數值型資料之間的混合運算

2. 資料型別儲存的範圍

C語言中資料型別所佔的位元組數,與作業系統和編譯器都有關,C語言提供了sizeof操作符來檢視某個型別變數在計算機記憶體中佔多少位元組

這裡給出一張速查表方便查詢

3.常量/變數和保留字

​ C語言中有常量,變數還有保留字

常量:程式執行中,其值不能被改變的量;eg:150

變數:可以改變的量,介紹變數之前,先了解下表示符,識別符號:類似與人的名字,由字母/數字/下劃線組成,第一個字元必須是字母或者下劃線,變數名就是一個表示符,而且區分大小寫

保留字:系統保留起來,有特殊用途,C++中一共由74個保留字,如下圖所示

4. 整型/實型/字元型/字串型

​ 1) 整型資料即整數

//整型變數的定義
int a, b, c;
unsigned int d, e, f;
// 定義變數的時候初始化
int k = 189;  
//在一個常數後邊加一個字母U,表示該常數用無符號整型方式儲存,相當於unsigned int
//在一個常數後邊加一個字母L,表示該常數用長整型方式儲存,相當於long
//在一個常數後邊加一個字母F,表示該常數用浮點數方式儲存,相當於float
//小數會被截斷
int test2 = 23.12F;  

​ 2) 實型資料

//十進位制浮點數表示形式 
0.12; 3.1415926;
//指數形式表示的浮點數  浮點數在記憶體中以指數形式儲存 具體如何儲存的  用處不大
//168E+2 ====>  16800   168E-2 1.68
float ab = 168E-2;
//實型變數
//float:單精度變數  一般提供7位有效數字(保守估計6位)
//double:雙精度變數 一般提供15-16位有效數字(保守估計15) 這個數字根據機器而定

//關於精度問題,有效數字
12345.678; 
// 10000.0 只有一位有效數字導致此結果  這就是精度問題
// 12000.0 有兩位有效數字導致此結果
// 12300.0 有三位有效數字導致此結果
// 12345.67X 有七位有效數字導致此結果

0.1234;
// 0.1XXX 只有一位有效數字
// 0.12XXXX 只有兩位有效數字

//十進位制數轉換成二進位制   然後把二進位制在轉換成十進位制  轉換中存在除法  會導致如下精度丟失問題
float af1 = 0.5;       // 0.500000000
float af2 = 0.51;      // 0.509999990

​ 3)字元型資料

//常規字元: 用單引號引起來的一個字元;
'a'; '$', 'b';
//特殊字元:轉義字元,以\開頭的字元序列, \n換行  常用的轉移字元
'\n', '\'', '\\', '\"';
//字元變數:只能儲存一個字元,因為一個字元型變數在記憶體中只存在一個字元
//實際上是把字元對應的ASCII碼放到了變數所代表的變數的記憶體中 
char x1, x2;
x1 = 97; //x1 = 'a'
x2 = 98; //x2 = 'b'
printf("c1 = %c, c2 = %c\n", x1, x2); //%c以字元的形式輸出
x2 = x2 + 4;  // 102 f
printf("c1 = %c, c2 = %c\n", x1, x2); //%c以字元的形式輸出

說到字元不得不說一下轉義字元,在這裡列出ASCII碼錶

4) 字串型

//字串常量:用一對雙引號引起來的一堆字元,可以是一個字元,也可以是多個字元  "hello world"
//字串變數
//不要混淆‘a’,"a"; 單引號引起來的是字元  雙引號引起來的是字串
//單引號a 和 雙引號a的區別   'a': a   "a": a '\0' 
//\0表示字串結束標記,但是在printf的時候 \0並不輸出出來
printf("abcdef\0aaaaaaaaaa\n");   //abcdef   
printf("\n");
printf("qqabcdef\0123565\n");   //    \0後面跟數字  被當作八進位制數   
printf("abcdefgh\n"); // 自動在末尾\0

5) 變數賦初值

int qq = 3;
int q, w, ee = 6; //只給ee賦初值,對於沒賦值的變數,其值是不確定的,不能隨意拿過來用
//變數必須先定義後使用

5.數值型資料之間的混合運算

原則:

//數值型資料之間的混合運算
int ax = 500;
double ada = 15.67;
double def = ax + ada; //系統把Int轉換成double,然後和原來的double相加
    

二. 算數運算子和表示式

1. C語言中的運算子

1)C語言中一共13中運算子

2) C語言中運算子的優先順序問題

2.算數運算子和算數表示式

​ 1)算數運算子就是平時所說的加減乘除求餘等運算,算數表示式是由算數運算子組成的表示式

////(1)算數運算子和算數表示式
//// + - * / %(取餘也叫模運算子,該運算子兩側都要求為整數)
//printf("表示式的結果%d\n", 5/3); //兩個整數相除,系統會捨棄小數部分
//printf("表示式的結果%d\n", 5%3);

​ 2)算數運算子的優先順序

//運算子優先順序問題:先乘除,後加減,如果優先順序相同,則先計算左邊,再計算右邊,(從左到右結合)
//2 + 3 * 5;
//printf("2+3*5 = %d\n", 2 + 3 * 5);

////賦值運算子 
//int i;
//i = 4; //把等號右邊的變數賦值給左邊的變數
//i = 4 + 3; // ==> i = (4+3) 括號的優先順序最高 如果搞不懂優先順序,那麼就用括號運算子把需要優先運算的內容括起來
//
////int a;
////a += a += a /= a + 6;//

3.強制型別轉換運算子

型別轉換分為兩種,

​ 1)自動型別轉換:系統替程式設計師轉換

​ 2)強制型別轉換:自動型別轉換達不到目的時,就用強制型別轉換

強制型別轉換運算子,將一個表示式轉換為所需要的型別   ((型別)) 優先順序挺高的
////強制型別轉換得到的是中間變數
////有些書籍不建議寫成int(a),實際如果寫成int(a)也是可以的
//int a;
//double b;
//b = (double)a; //這屬於強制型別轉換 但是a本身的型別並沒有變化  而是結果發生了變化


////(int)(a+b)  將a+b的值轉換為整型;
////總結強制型別轉換運算子的一般形式 (型別名)(表示式)
//// (int)x + y; // 只講x轉換成了整型,然後和y相加了
float x;
int i;
x = 3.6f;
i = (int)x; //3
printf("x = %f, i = %d\n", x, i);

4.自增自減運算子

​ 自增和自減操作符 ++ -- 經常用

​ 只能用於變數,不能用於常量表達式,比如錯誤的用法:++5

​ 當自增或者自減運算子在變數後邊的時候,對於該自增或者自減表示式的使用是,先用後加

i = 6;
//相當於i自身加1,然後結果值在賦值給i
//++i; // 先加後用  
//i++; //  先用後加 
//如果++i或i++單獨寫成一個語句,沒有任何區別,都是將變數自身+1,沒有區別,但是如果放在函式呼叫中,結果就會不同
printf("i++的結果是%d %d\n",i++,i); // 先用後加,i++結果為6 i本身為7
printf("++i的結果是%d %d\n",++i,i); // 先用後加,i++結果為8 i本身為8
//表示式: 理解為+-*/串起來的一個式子
//-i++ ==> -(i++)
//i+++j; // ==> (i++)+j;c編譯器在處理時會盡可能多的從左到右將若干個字元組成一個運算子 

5.賦值運算子和賦值表示式

    //1 賦值運算子
    //賦值運算子和賦值表示式  = 將等號右邊的值賦給等號左邊的變數
    // = 左邊 是個變數 所謂這個賦值, 可以理解位給變數一個值,或者是改變變數到某一個值
    int a;
    a = 5;
    a = 6.5; //將實型資料賦給整型變數時,小數部分會被設定 a = 6;
    a = 18 + 50;
    a = a + 3; //73

    float f;
    f = 125; // 1.25E2 實型變數按指數形式儲存在記憶體中的
    // 幾個概念
    //char a; //變數定義  系統給a分配一個位元組的記憶體,記憶體裡的之不確定
    char b = 90;//變數定義同時賦初值,也叫定義時初始化  -128-=127
    b = 900;//賦值語句  會溢位  溢位後a裡面的內容,就變得不可預料了
    //賦值的原則,儘量保證型別相同,型別不同的用強制型別轉換,當用強制型別轉換時,必須明確知道不會溢位
    int c;
    c = (int)23.5;

    int d;
    d = 1000000 * 1000000; //溢位


    //2. 複合的賦值運算子:在賦值運算子之前加上其它運算子,構成了複合的賦值運算子(複合的賦值運算子之間必須緊挨著不能用空格分開)
    int e= 8;
    e += 3; // e = e + 3;
    
    int x = 2, y = 8;
    x *= y + 8; // x = x * (y+8);如果*=右側是個表示式的話,則相當於表示式有括號
    x %= 3; // x = x % 3;
    
    //3. 賦值表示式 本身也是有值的 賦值運算子從右到左執行
    int z = 4;
    printf("z = 5這個賦值表示式的值是%d\n", z = 5);
    printf("z += 8這個賦值表示式的值是%d\n", z = 5);

    int aaa,bbb;
    aaa = (bbb= 5); // aaa = 5; bbb = 5;

    int ccc = 23; 
    aaa = bbb = ccc ;
    
    aaa = 3;
    aaa += a -= a*a;// a+= (a -= (a*a)) -12

6.逗號運算子和逗號表示式


    //4. 逗號運算子和逗號表示式
    int a;
    a = (4,5);//5
    a = (3+5,6+8);//14
    a  = 3*5,a*4; // a = 15 表示式為60
    result = (a  = 3*5,a*4); //result 60 a=15
    //逗號表示式的擴充套件形式:
    //表示式1,表示式2,表示式3,……,表示式N,最終的值是表示式N的值

    int x,a;
    x = (a = 3,6 * 3);// a = 3, x = 18
    x = a = 3, 6 * a;//a = x = 3; 表示式結果為18