C 語言中 printf 的問題(續)

九月 30th, 2007

前一篇當中提到了 printf 結果異常的問題,在睡前翻了一下手邊借來的「C Primer Plus」,沒想到就有提到這個問題,印象中其他書籍似乎都沒有講到,C Primer 系列果然是好書!

簡單來說就是 C 語言中,compiler 可以選擇先計算函數中的哪個參數,以增加編譯程式的效率,所以前一篇的例子:


printf("%d, %d", age, age++);

compiler 很可能會先算第二個參數,先改變了 num 數值,這樣就造成結果不如預期了。

在「C Primer Plus 5/e 中文精華版」第五章有寫道,遵循以下原則可以避免這些問題:

  1. 請勿在函數當中,對使用不止一次的參數使用遞增或遞減運算子。
  2. 請勿在運算式當中,對使用不止一次的變數使用遞增或遞減運算子。

第一點就是上面所說的例子,第二點的例子如下:


n = 3;
y = n++ + n++;

在 C 標準中並沒有定義這行程式會如何執行,是哪一個先加 1 再運算,還是都先不加,造成了含糊不清的結果,應當避免這種寫法。

C/C++, 程式筆記 ,

  1. Tokyo
    七月 7th, 2008 at 09:29 | #1

    原來如此
    以前倒是沒注意到這類問題
    而且老師也說這種寫法實在是...

  2. 四月 26th, 2009 at 10:08 | #2

    大大你是大學生了吧?
    可以問一下您是哪個科系嗎?

    還有c語言跟c++是不是ˇ有些語法不能共用?

  3. 四月 29th, 2009 at 17:18 | #3

    @聽。風
    我資訊工程系的,即將畢業 ^^

    兩者是有些差異的,C++ 能相容大部分 C 語法,但反過來就不一定了,
    但要有一個觀念:「其實很多 C++ 的新特性都可以用 C 來實作出來(包括 OO 部份)」。
    至於主要差異在許多書上和 wiki 當中都有提到唷!

  1. No trackbacks yet.