1. 程式人生 > >C語言程式設計入門之--第五章C語言基本運算和表示式-part3

C語言程式設計入門之--第五章C語言基本運算和表示式-part3

5.3  挑幾個運算子來講  

  常用的運算子除了加減乘除(+-*/)外,還有如下:

  注意:以下運算子之間用逗號隔開,C語言中也有逗號運算子,這裡不講逗號運算子。

 1. 賦值運算子 =,+=,*= 

 2. 一元運算子 ++, --

 3. 相等運算子 ==,!=  ,關係運算符 < ,>,<=,>=  

 4. 條件運算子 ?:

 6. 位運算子 &, ^, |  ,! 邏輯運算子 &&, ||,  移位運算子 >>, <<

 5.3.1 賦值運算子

   給變數賦值,可以通過“=”連線,將右邊的數值賦值給左邊的變數,如:

int a = 10;
int b;
b = 10;

  賦值運算子中還能夠做加減乘除與或非等等的運算,如:

#include <stdio.h>

void main()
{
    int a = 10;
    
    a += 100;
    printf("a = %d \n", a);
}

  執行結果為:a = 110;

    上述a += 100 等價於 a = a + 100; 以此類推, a -= 100 等價於 a = a - 100; a *= 100; 等價於 a = a * 100 ......後續講到的&,^,| 等位運算子也能結合“=”湊合著來使用。

 

 5.3.2 一元運算子,增增,減減

   C語言中一元運算子,有加加++和減減--,但是沒有乘乘**和除除//。因為++的意思是變數加一,--的意思是變數減1,所以沒有必要**和//,因為變數乘以1和除以1都是等於變數本身。

  因為++和--的意思類似,所以就挑++來講解。
  ++可以放在變數前面,也可以放在變數後面,意思不同,寫法如下:

int a = 10;
++a;
a++;

  ++a是先進行自增1的運算,然後進行其它的操作,a++是先進行其它操作,然後再進行自增1的運算,這麼說不好理解,如下程式碼:

#include <stdio.h>

void main()
{
    int a = 0;
    int b = 10;
    
    a = ++b;

    printf("a = %d b = %d\n", a, b);
}

  執行結果是:a = 11 b = 11; 程式碼中,a在變數宣告的時候賦值為0,b賦值為10,在運算表示式中,a = ++b; 先進行b的自增運算,這時候b就變為了10+1 = 11,然後賦值給a,a的取值就變為11了,再看下一段程式碼:

#include <stdio.h>

void main()
{
    int a = 0;
    int b = 10;
    
    a = b++;

    printf("a = %d b = %d\n", a, b);
}

  執行的結果是:a = 10 b = 11;程式碼中,a在變數宣告的時候賦值為0,b賦值為10,在運算表示式中,a = b++;先進行a = b 的賦值運算,然後再進行b = b + 1 的自增運算,所以a的取值就是10,b的取值為11。

  如果++b和b++是完整的一句表示式,

  注意:完整的一句表示式以分號;作為為這句結束的標識。

  也就是,

#include <stdio.h>

void main()
{
    int a = 0;

    ++a;

    printf("a = %d\n", a);
}

#include <stdio.h>

void main()
{
    int a = 0;

    a++;

    printf("a = %d\n", a);
}

    它們的執行結果是一致的,因為完整的一句表示式中,沒有其它的操作,所以就只做了自增1的操作。所以請記住:++a是先進行自增1的運算,然後進行其它的操作,a++是先進行其它操作,然後再進行自增1的運算

    熟悉了以上概念就可以思考以下結果:

int a, b, c, d,e, f, g, h;

a = 10;
b = (a++) + (a++) + (a++);
a = 10;
c = (++a)+ (++a) + (++a); a = 10;
d = (++a) + (a++) + (a++);

a = 10;
e = (a--) + (a--) + (a--);
a = 10;
f = (--a)+ (--a) + (--a); a = 10;
g = (--a) + (a--) + (a--);
a = 10;
h = (a--) - (a++) + (++a) - (--a);

  請問b,c,d,e,f,g,h的取值為多少?不理解的話可以再次回顧剛才的概念,然後加printf語句來核對結果。

 

 5.3.3 和bool值有關的相等運算子與關係運算符

   第四章的時候有講過一種資料型別叫做 bool,它的取值就兩種,true,false。計算機語言是二進位制,記憶體中,true等於1,false等於0,如以下程式碼,

#include <stdio.h>
#include <stdbool.h>

void main()
{
    printf("%d , %d \n", true, false);
}

 執行結果為 1 , 0;所以更加清晰的瞭解了,真true的值為1,假false的值為0。

 注意:需要宣告標頭檔案 stdbool.h 才可以使用 bool 變數,才可以列印 true 和 false 的值。

 有了以上概念,就可以理解相等運算子的取值了,比如兩個等於號 == ,意思為這兩個取值是否相等,是的話運算結果值為1,不是的話運算結果值為0。

 注意:千萬不要把賦值運算子 = 與相等運算子 == 混淆了!後續講解條件語句會再提到這點。

 感嘆號加上等號 != ,意思為這兩個值是否不相等,是的話運算結果值為1,不是的話運算結果值為0。程式碼如下:

#include <stdio.h>
#include <stdbool.h>

void main()
{
    int a = 10;
    int b = 5;
    bool c; 
    
    c = (a == b);
    
    printf("c = %d \n", c); 
}

 

  執行結果為,c = 0;所以c的值就說明了 a == b 是假,也就是 a 和 b 相等是不成立的。

  注意:讀者可以自行改程式碼,把 b = 5 改為 b = 10 ,就能發現,c的值變為1了,說明這時 a 等於 b 成立。

  把程式碼稍微修改一下,把 a == b 改為, a != b 如下:

#include <stdio.h>
#include <stdbool.h>

void main()
{
    int a = 10;
    int b = 5;
    bool c;
    
    c = (a != b);
    
    printf("c = %d \n", c);
}

  執行結果為,c = 1;說明 a 不等於 b 是成立的,所以運算結果值取1。

  同理,小於號 < 取運算結果,左邊是否小於右邊,是的話運算結果值取1,否的話運算結果值取0;

  小於等於號 <= ,大於號 > ,大於等於號 >= 也都是這樣的用法。

 

 5.3.4 條件運算子

   問號加上冒號就組成了條件運算子的表示 ?: ,使用方式一般套用以下格式:

條件 ? 表示式1 : 表示式2

        條件其實也是一種表示式,只不過條件的取值是 bool 值,如果取值是true(1),運算表示式1,如果取值是false (0),運算表示式2,程式碼如下,

#include <stdio.h>
#include <stdbool.h>

void main()
{
    int a = 10;
    int b = 5;
    
    (a > b) ? (++a) : (++b);
    
    printf("a = %d, b = %d\n", a, b);
}

  執行結果為:a = 11, b = 5;  在表示式 (a > b) ? (++a) : (++b); 中, 先判斷 a 是否大於 b,結果是大於,所以選擇問號後面的表示式 ++a 來運算。

  後續講到巨集定義的時候會再次涉及條件運算子做個小功能,這裡mark一下。

&n