ログイン
kid's world

定数

定数

型に潜むバグ

それでは,前回に登場した「10÷3」が正しく計算されないバグについて解説しよう。前回からずっと気になって夜も眠れなかった方がいたかもしれない。しかし今日からはそのバグの理由を知って,ぐっすりと眠れることだろう。ここで,前回紹介したプログラムを再度List 4に示す。

List 4: bug4.c

#include <stdio.h>

main()
{
  printf("%d\n", 10/3);
}

このソースコードには何の問題もない。コンパイルも実行も正常に行える。しかし,画面に表示される数値(「3」と表示される)は,「10÷3」の答えにはなっていないのである。読者の中には,printf関数の「%d」は整数値を表示するのだから,それを実数値を表示する「%f」に書き換えて,

printf("%f\n", 10/3);

とすればどうか,と考えた方もいるだろう。

しかし,相変わらず画面には正しい答えが表示されない。いったいどういうことだろうか。

そろそろ答えを出そう。このバグの裏には,今回学んだ「型」によって知らず知らずのうちに引き起こされた現象が潜んでいる。まず「10」や「3」という数値である。これらはC言語では,実は「int型」として扱われる。すなわち,

10/3

は,イメージ的には,

int型/int型

という計算を行っているのである。そして問題なのは,「+」や「/」などの算術演算子は,

与えられた数値の型で演算を行い,計算結果はその型で返す

という性質を持っているということである。「10」や「3」はint型であるため,計算結果もint型となり,それを表示しようとしているprintfは結果として「3」という整数値を表示することになる。つまり簡単にいってしまえば,

整数値を計算するようにいわれたから,答えは整数値にした

ということである。よって,

double型/double型

という計算をさせれば正しい答えが出せるのである。では,そうしたいときはどのように書けばよいのだろうか。「10」や「3」はint型なのだ。

……実は,小数点を書けばよい。「10」というキリのいい数字だったとしても,むりやり「10.0」とでも書いておくのだ。つまり,List 5のようにすれば正しい答えが表示されるようになる。試していただきたい。

List 5: bug4.cのバグ取り後の姿

#include <stdio.h>

main()
{
  printf("%f\n", 10.0/3.0);
}

定数と型

このように,型は変数だけにあるのではなく,今まで何気なく使ってきた数値などにも存在していたわけである。C言語では,プログラム中において値が変化しない要素を「定数」と呼んでいる。定数がどのような型になるのかは,厳密に定められている。「小数点がつくとdouble型になる」というのは,そのよい一例だ。

ここで定数について,どのような書き方をするとどのような型になるのかを簡単に説明しておこう。

整数値

小数点をつけずに数値を書くと,それはint型やlong型などの整数を表す型になる。どの型になるかは,数値の大きさによって決まり,可能な限りサイズの小さな型になる。たとえば「100」はint型になる。

どうしてもlong型にしたい場合は,最後に「L」か「l」を付け加える。たとえば,「100L」はlong型の100である。

もし,数値が「0」(ゼロ)から始まる場合は8進数として扱われ,「0x」か「0X」で始まる場合は16進数として扱われる。今はまだ8進数と16進数を使う機会はないだろうが,「0」から始まる数値を書くと別の意味になってしまうということぐらいは覚えておいても損はないだろう。

実数値

小数点のついた数値を書くと,それが整数であってもdouble型となる。たとえば,「100.」はdouble型である(小数点以下がなくても大丈夫だ)。もし,float型にしたい場合は最後に「F」か「f」を付け加え,longdouble型にしたい場合は最後に「L」か「l」を付け加える。たとえば,「200.0L」はlong double型になる。

今の段階では「小数点を使うとdouble型になる」とだけ覚えておいてもよいだろう。

printf関数

printf関数で数値を表示するとき,文字列の中に「%d」や「%f」という変換文字を用いたが,型に応じて適した文字を使わなければ正しい数値は表示されないので注意してもらいたい。Table 2に,表示したい数値の型と利用する文字の対応表を示しておく。

Table 2: printf関数の変換文字

/c/var-table2.png


変数とメモリの関係」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告