
この記事はかなり昔に執筆されており、誤りを含む場合があります。
C言語クイズの4問目です。 C言語クイズ1, C言語クイズ2 と比べると、かなり難易度は下がっていますが、 C言語クイズ3 よりは、若干 C言語仕様に詳しくないと解けません。問題
C言語の標準関数であるprintf()。 おそらくC言語における最も使用頻度の高い関数であり、様々なフォーマットを指定して値を出力できることは、周知の通りです。 例えば "%03d"とフォーマットを指定すると、指定した値を3桁のゼロ詰めで表示します。 しかし、しかし、・・・上記コードを実行してみると、おかしな現象が生じます。 "%03d"とフォーマットを指定している為、予想では、#include <stdio.h> int main(void) { printf(" 1 ⇒ %03d\n", 001); printf(" 10 ⇒ %03d\n", 010); printf("100 ⇒ %03d\n", 100); return 0; }と出力されるはずなのですが、結果は以下の様になります。1 ⇒ 001 10 ⇒ 010 100 ⇒ 100つまり、本来「10」が表示されるべきところを、何故か「8」が表示されている! という不思議。 ・・・さて、何故でしょう?? 皆さんはこのコードの謎を解くことが出来ますでしょうか^^;)
![]()
解答
数値の先頭に「0x」をつけると、コンパイラはその値を十六進数と見なします。 同様に、数値の先頭に「0」をつけると、コンパイラはその値を八進数と見なします。 つまり、010 は 十進数の10ではなく、十進数では 8。 そのため、010 を printf関数で表示すると「8」が表示されていたということです♪ ・・・種明かしされると、無性に悔しくなりますよね(涙)
