C算式與算子
初 寫:2004.03.01, 更新日期:2022.10.13
 
參考資料:
 
  • =」(assignment operator) 的意義:「 設定給 」
    • 數學的迷思
       a = a + 5;

    • 電腦中,變數的觀念
      實驗1:5 = a + 5;
      實驗2:a + b = a + 5;

    • "=" 的左 與 "=" 的右

  • [範例]: 直接印值  printf(" Answer: %d\n", 2*3+4/2 );


  • [練習]: 
    a = () ,  a = ?
    請將上述算式,以範例printf的算式來計算,並顯示出正確的數值?
    (不能直接兜答案、不能宣告變數.)


  • [練習 急轉彎]
    如果要將一個班級的同學們平均分成三組,
    請問如何以一個運算式的結果,來計算表示呢?


  • 算數運算子(Arithmetic Operator)
    算子 範例 說明 備註
     *, /  a * b  a 乘以b   
     a / b  a 除以b  
     %  a%b  a除以b後,取其餘數 讀作(mod)
     +, -   a+b  a加b  
     a-b  a減b  

  • 範例1
    要如何寫成算式表示?

  • 範例2 [上機練習]

    請輸出:
    d1(b^2-4ac)=
    d2(a^3-a^2-1)=

  • 練習1: [上機練習] 請將範例2 改為a, b, c手動輸入
    a =
    b =
    c =
    d1(b^2-4ac)=
    d2(a^3-a^2-1)=


  • 練習2: y=aX2+bX+c, (X,a,b,c都為整數)
    輸入 X, a, b, c, 輸出y的值

    測資1:
    輸入: 6 3 2 1
    輸出: y=121

    測資2:
    輸入: 3 7 5 7
    輸出: y=85


  • 位元運算子(Bitwise Logical Operator)
    算子 範例 說明 備註
     >>  a >> b  將a化成位元組,往右移b個位元   
     <<   a << b  將a化成位元組,往左移b個位元  
     |  a | b  a 和 b 做 OR 運算  
     &  a & b  a 和 b 做 And 運算  
     ~  ~a  將 a 做 Not 運算  
     ^  a^b  a 和 b 做 XOR 運算  
    ps1: 運算對象為位元, 所以是將 a, b轉換成二進位後的值再運算。
    ps2: XOR([0,0]和[1,1]=0,[1,0]和[0,1]=1)


    補充說明:
    XOR在密碼學裡,常被用來做資料與金鑰的加密與解密運算:
    A xor B = C,  C xor A = B,  C xor B = A.
    #include <stdio.h>
    main()
    {
       char ch='a';
       printf("before encoding:%c\n", ch);
       ch = ch^0x6;
       printf("encoding:%c\n", ch);
       ch = ch^0x6;
       printf("decoding:%c\n", ch);
    }
    執行看看結果...

  • 比較運算子(Comparison Operator)
    算子 範例 結合 備註
     >, <  a>b, a<b  比較a大於或小於b  
     ==  a == b  比較a,b是否相等  
     !=  a != b  比較a,b是否不相等  
     >=, <=  a>=b,a<=b  比較a大於或等於b, a小於或等於b  

  • 邏輯運算子(Logical Operator)
    算子 範例 結合 備註
     &&  a && b  a 和 b 做 And 運算  
     ||  a || b  a 和 b 做 OR  運算  
     !  ! a  a 做 Not 運算  

  • 遞增、遞減運算子(increment, decrement)
    算子 範例 結合 備註
     ++  a++;(後置)
     ++a;(前置)
     以舊有的a 運算後, 才將a 加1.
     先將a 增1, 再以其值作其他運算.
     a=a+1;
     --  a--;
     --a;
     以舊有的a 運算後, 再將a 減1.
     先將a 減1, 再以其值作其他運算.
     a=a-1;

  • [範例1]: [結合性] 右到左, 左到右
    #include <stdio.h>
    main()
    {
     int a=2, b=3, ans;
     ans=(
    a++)*b;
     printf("Answer:%d, a=%d, b=%d\n",ans,a,b);
    }
    請寫下執行結果.

  • [範例2]:
    #include <stdio.h>
    main()
    {
     int a=2, b=3, ans;
     ans=(
    ++a)*b;
     printf("Answer:%d, a=%d, b=%d\n",ans,a,b);
    }
    請寫下執行結果.

  • [實作1]:
    #include <stdio.h>
    main()
    {
     int a=2, b=3, ans;
      ans=
    a*b;
      a=a+1;
     printf("Answer:%d, a=%d, b=%d\n",ans,a,b);
    }
    請問,實作1執行結果,和哪一個範例結果一樣,比較之!

  • 常用運算子執行優先順序表(越上面越優先)
    算子 說明 結合性 備註
     ( )  括號, 函數    
     + -  正負號  右→左  
     ++, --  遞增, 遞減    
     !  邏輯算子(Not)    
     (type)   強制型別轉換     
     * /  乘, 除  左→右  
     %  取餘數    
     + -  加, 減  左→右  
     <, <=, >, >=  比較算子  左→右  
     ==, !=  相等算子  左→右  
     ^  位元算子  左→右  
     &&  邏輯算子(且And)  左→右  
     ||  邏輯算子(或OR)  左→右  
     =
     +=,
     -=,
     *=,
     /=
     %=
     設定運算子
     a+=b;就是a=a+b;
     a-=b;就是a=a-b;
     *=, /= 亦同.
     右→左  


  • sizeof() 是一元運算子,而不是函數!
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
      int a=2;
      printf("%d\n",
    sizeof(++a) );
      printf("%d\n", a );

      return 0;
    }
    執行看看,結果為何?
    如果是函數,則運算式++a會先計算,然後傳遞值給函數,
    但得到的結果,並非是如此,而是直接對變數的一元運算子。



曾聖超老師製作