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
と出力されるはずなのですが、結果は以下の様になります。
つまり、本来「10」が表示されるべきところを、何故か「8」が表示されている!
という不思議。
・・・さて、何故でしょう??
皆さんはこのコードの謎を解くことが出来ますでしょうか^^;)
解答
数値の先頭に「0x」をつけると、コンパイラはその値を十六進数と見なします。
同様に、数値の先頭に「0」をつけると、コンパイラはその値を八進数と見なします。
つまり、010 は 十進数の10ではなく、十進数では 8。
そのため、010 を printf関数で表示すると「8」が表示されていたということです♪
・・・種明かしされると、無性に悔しくなりますよね(涙)