TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【C言語クイズ4】printf()関数誤動作?!

C言語クイズの4問目です。

C言語クイズ1, C言語クイズ2 と比べると、かなり難易度は下がっていますが、
C言語クイズ3 よりは、若干 C言語仕様に詳しくないと解けません。


問題

C言語の標準関数であるprintf()。 おそらくC言語における最も使用頻度の高い関数であり、様々なフォーマットを指定して値を出力できることは、周知の通りです。 例えば "%03d"とフォーマットを指定すると、指定した値を3桁のゼロ詰めで表示します。 しかし、しかし、・・・
#include <stdio.h> int main(void) { printf(" 1 ⇒ %03d\n", 001); printf(" 10 ⇒ %03d\n", 010); printf("100 ⇒ %03d\n", 100); return 0; }
上記コードを実行してみると、おかしな現象が生じます。 "%03d"とフォーマットを指定している為、予想では、
1 ⇒ 001 10 ⇒ 010 100 ⇒ 100
と出力されるはずなのですが、結果は以下の様になります。 C言語クイズ:printf関数の誤動作 つまり、本来「10」が表示されるべきところを、何故か「8」が表示されている! という不思議。 ・・・さて、何故でしょう?? 皆さんはこのコードの謎を解くことが出来ますでしょうか^^;) 考え中

解答

数値の先頭に「0x」をつけると、コンパイラはその値を十六進数と見なします。 同様に、数値の先頭に「0」をつけると、コンパイラはその値を八進数と見なします。 つまり、010 は 十進数の10ではなく、十進数では 8。 そのため、010 を printf関数で表示すると「8」が表示されていたということです♪ ・・・種明かしされると、無性に悔しくなりますよね(涙)
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ