close

印出變數的內容

對於任何一個變數,當我說它現在的值是3,你要如何確認呢? 或者當你好不容易算完一個數學運算,又要如何知道計算的結果? 於是,我們需要學會如何把整數變數的內容印出來。

這裡我們要用到printf的特別格式字元功能了, printf除了可以印出一段固定的文字外,還可以在中間加入「%d」這個特殊的標記來插入一個數字, 多說無益,我們用一段範例來解釋:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a, b;

    a = 24;
    b = 37;
    printf("Ho%dw are y%dou?\n", a, b);

    return 0;
}

這個程式執行後將會印出下面這樣一行字:

Ho24w are y37ou?

由這個範例我們可以看出一些事:

  • printf括弧中的固定字串後面可以加上一個逗號,然後插入不定數量的參數,每個參數用逗號分隔。 而在這個範例中放了兩個整數變數。
  • 固定字串中的「%d」對printf是一個特別的記號,這個記號不會被印出來, 而是會把後面的整數參數內容抓出來插入在這個記號所在的位置。

上面的範例我故意把數字混入我們所顯示的單字中,目的是為告訴你C語言只會很笨又很單純的 把你給的東西按照順序塞進去,至於格式、排版等是要由使用者自己處理的。 當然我們實際上不會像這個範例這樣故意弄得看不清楚結果,我們實際上可能會像這樣寫:

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

當printf的顯示字串裡出現有「%d」的時候,printf會抓取後面的第一個參數內容來塞到第一個「%d」所在的位置、 第二個參數會被填入第二個「%d」位置、第三個參數會被填入第三個「%d」位置…以此類推。 注意像「%d」這樣的格式記號(實際上有不少種格式記號)是只認參數的位置的, 不管你後面傳入的變數是什麼,printf總是按照位置順序抓取後面的參數。 所以如果有人寫了像下面這樣的程式碼:

int a=3, b=5, c=7;
printf("a=%d, b=%d, c=%d\n", c, b, a);

則最後會在終端機上面顯示的結果將是:

a=7, b=5, c=3

使用printf這類函式時,還有一個很重要的東西要注意,那就是格式字必須要和後面的參數互相匹配。 比如說你在字串裡放了一個「%d」,然而後面的參數卻不是一個整數變數 (變數其實有很多種,只是我們現在只教了整數變數而已)、 甚至後面根本就沒有參數,則程式會發生什麼怪事都有可能, 所以程式人員必須要小心處理這些可能犯錯的地方。 下面我們以一小段程式碼來具體說明:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a=3, b=5;
    printf("a=%d, b=%d, c=%d\n", a, b);

    return 0;
}

在筆者的電腦上,上面的程式最後跑出這樣的結果(注意每個人跑的結果可能會不太一樣):

a=3, b=5, c=4195696

上面的範例中的c印出了一個奇怪的數字,是因為我們的printf字串裡出現了第3個格式字,所以他嘗試去抓取第3個參數。 雖然我們後面只有a、b,並沒有第3個參數,但是printf並不知道這件事,於是最後我們就不知道他去抓到什麼東西了! 也因此才造成最後的結果異常。 另外要注意的是類似這樣的問題的結果事實上是不可預期的,也就是不同的電腦上、甚至是不同的執行時間上, 其執行的結果都可能不同。

另外還有一個使用上必須要小心的地方,請見下面的範例:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a;                // 這裡我們宣告建立一個變數a。
    printf("a=%d\n", a);  // 請猜猜看這時候a的內容是什麼呢?
    a = 7;                // 設定變數a的內容為7。
    printf("a=%d\n", a);  // 所以這裡會顯示a的值為7。

    return 0;
}

在筆者的測試中,上面的程式跑出了這樣的結果:

a=-1218515371
a=7

注意上面的程式結果在每一次的測試中可能不會一樣,請讀者自己編譯執行看看結果, 然後再多執行幾次比較看看有無差異。

在上面測試中,第二個列印毫無問題的印出了7,但為什麼第一個列印會印出一個奇怪的數字? 這是因為我們宣告建立了變數後並沒有對他設定任何數值就把他拿來用了。 這裡指出了一個很重要的重點,「變數宣告只是讓編譯器準備一塊記憶體空間給這個變數使用而已, 不會對他的內容進行任何變更或初始化行為」。 也就是說,當我們宣告一個變數後,除非明確的設定一個什麼東西給他,否則他的內容有可能是任何內容, 並且每次執行時都可能不一樣。

重點回顧

  • printf中除了顯示的字串外,我們還可以傳入很多用逗號分隔的的參數給它。
  • 在printf中的顯示字串插入「%d」格式字,可以將後面的參數內容(整數)顯示在該位置上。
  • 可以使用多個「%d」格式字來按照順序插入多個整數參數,唯記得格式字的數量和後面的參數數量要匹配。
  • 變數在被設定內容之前,其之內容是不可預期的隨機資料。

練習與討論

  1. 請寫一個程式,宣告一些變數,並給這些變數設定一些數值,然後把變數的內容印出來看看是否與你所設定的值一樣?
  2. 如果我們只宣告變數而不給他們設定數值,然後直接把變數內容印出來的話,結果會是什麼呢?請實際試試看。
  3. 已經設定過內容的變數可以再被設定一次嗎?結果會有何不同?請勤勞的使用printf印出變數的內容,追蹤變數在每一個操作下的內容有何不同。
arrow
arrow
    文章標籤
    C語言教學
    全站熱搜

    夜行者 發表在 痞客邦 留言(1) 人氣()