C 語言初學教材 - 第二章 遞增遞減

C 也有提供方便的遞增運算子及遞減運算子,通常用於控制結構中的的各種迴圈

運算子功能範例
++前遞增++a
++後遞增a++
--前遞減--a
--後遞減a--


遞增運算子為連續兩個加號,遞減運算子則是連續兩個減號,兩者都是單元運算子,直接施用在連接的運算元上。所謂的遞增運算就是對施用變數加 1 ,遞減就是減 1 ,這裡須注意,為了避免語意上的歧義或語法錯誤,通常我們會把遞增運算子及遞減運算子與施用變數直接連起來,然後與其他運算單位以空格分開。


前遞增就是先將運算元遞增,然後才加入運算式計算,後遞增則是運算式先行計算,運算式計算完後才進行遞增,而前後遞減亦同,就是將遞增改成遞減。如下例
#include <stdio.h>

int main(void)
{
    int a, b, c;
    
    a = 0;
    b = 0;
    c = a++ - ++b + ++a; 
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:idtest.c
    功能:示範遞增運算子及遞減運算子的使用
    作者:張凱慶
    時間:西元2010年7月 */


編譯後執行,如下



計算集中在第 9 行
c = a++ - ++b + ++a;


變數 a 與變數 b 最初的值為 0 , a 後遞增加上 b 前遞增再加上 a 前遞增,因此變數 c 等同下面的等式
c = 0 - 1 + 1;


所以 c 等於 0 。 a 總共遞增了兩次, b 遞增了一次,因此 a 等於 2 , b 等於 1 。


我們提供另一個使用遞增運算子與遞減運算子的範例,執行過程中會跟使用者互動,詢問所施用變數目前的值,另外用一個變數累計答對次數,程式如下
#include <stdio.h>

int main(void)
{
    int target = 0;
    int counter = 0;
    int guess;
    
    printf("target = %d\n", target);
    printf("target++\n", target++);    
    printf("--target\n", --target);
    printf("target++\n", target++);
    
    printf("請輸入target現在是? ");
    scanf("%d", &guess);
    
    if (target == guess) {
        printf("答對囉!\n");
        counter++;
    }
    else {
        printf("答錯了!\n");
        counter--;
    }
    
    printf("target--\n", target--);
    printf("++target\n", ++target);
    printf("--target\n", --target);
    printf("++target\n", ++target);
    
    printf("請輸入target現在是? ");
    scanf("%d", &guess);
    
    if (target == guess) {
        printf("答對囉!\n");
        counter++;
    }
    else {
        printf("答錯了!\n");
        counter--;
    }
    
    printf("target++\n", target++);
    printf("--target\n", --target);
    printf("++target\n", ++target);
    printf("--target\n", --target);
    
    printf("請輸入target最後是? ");
    scanf("%d", &guess);
    
    if (target == guess) {
        printf("答對囉!\n");
        counter++;
    }
    else {
        printf("答錯了!\n");
        counter--;
    }
    
    if (counter > 0) {
        printf("\n共答對 %d 次....\n", counter);
    }
    else {
        printf("\n都沒有答對耶!再加油喔!\n");
    }
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:gid.c
    功能:示範遞增及遞減運算子的使用
    作者:張凱慶
    時間:西元2010年7月 */


請自行編譯執行這個範例,測試看看自己是否已經了解遞增、遞減的觀念。


問題與討論
  1. 遞增跟遞減有什麼不同?
  2. 前遞增跟後遞增的差別在哪裡?
  3. 為什麼要用遞增或遞減,對寫程式寫什麼幫助?
  4. 編譯執行 gid.c ,你答對了幾次呢?
  5. 網友 Dkky 測試 gid.c 後,發現答對一題的情況下,程式卻顯示都沒有答對,這是為什麼呢?




4 則留言:

Unknown 提到...

您好,最近在學習C,感謝貴站提供如此有用的資訊可供自習。

本範例中的23,40和57這三行是否多餘,因為它們似乎會造成count的值出錯誤。

Kaiching Chang 提到...

count 的計算在全答錯與全答對是正確的,這裡的設計是保留一些趣味性囉! ^_^

Unknown 提到...

printf("--target\n", --target);
造成data argument not used by format string

是我哪裡有漏掉嗎?

Unknown 提到...

printf("--target\n", --target);
造成data argument not used by format string

printf()函數中缺少了轉換符號
少了%d去顯示參數--target

他也顯示出缺少format string(轉換符號)
如果我講的有錯請大力的糾正 謝謝