九月30
C 語言中 printf 的問題(續)
->
在前一篇當中提到了 printf 結果異常的問題,在睡前翻了一下手邊借來的「C Primer Plus」,沒想到就有提到這個問題,印象中其他書籍似乎都沒有講到,C Primer 系列果然是好書!
簡單來說就是 C 語言中,compiler 可以選擇先計算函數中的哪個參數,以增加編譯程式的效率,所以前一篇的例子:
printf("%d, %d", age, age++);
compiler 很可能會先算第二個參數,先改變了 num 數值,這樣就造成結果不如預期了。
在「C Primer Plus 5/e 中文精華版」第五章有寫道,遵循以下原則可以避免這些問題:
- 請勿在函數當中,對使用不止一次的參數使用遞增或遞減運算子。
- 請勿在運算式當中,對使用不止一次的變數使用遞增或遞減運算子。
第一點就是上面所說的例子,第二點的例子如下:
n = 3;
y = n++ + n++;
y = n++ + n++;
在 C 標準中並沒有定義這行程式會如何執行,是哪一個先加 1 再運算,還是都先不加,造成了含糊不清的結果,應當避免這種寫法。
Trackback:

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