スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

warning: comparison is always true due to limited range of data type【C言語】

※参考:「熊猫さくらのブログ[http://kumaneko-sakura.sblo.jp/archives/20081215-1.html]

今日もまたコンパイラに怒られました。

$ gcc ./test.c
./test.c: In function ‘main’:
./test.c:9: warning: comparison is always true due to limited range of data type


私の哀れな英語力で読むと...

『データ型の制限範囲のせいで、条件式が常に真(True)を返しますよ!』

...ということらしいです。なんかよくワカランなぁ。。。
実際に動かしたのは以下のプログラムです。

#include <stdio.h>

int main(){
    unsigned char x;   // 年齢

    x = 18;   // 私は18歳ですよ!(ウソ

    // 判定処理
    if(0<=x && x<=19){
        printf("あなたは未成年!\n");
    } else if(x>=20){
        printf("成人なのですか...\n");
    }

    return 0;
}

年齢を判定するプログラムです。

年齢は負の数には成り得ませんよね。(「私はマイナス8歳です」ってバケモノか。)
なのでunsignedをつけました。(符号なしを意味する)

あと、255歳を超える人間なんて見たことはありませんよね。
なのでchar型(ここでは8bitなので256通り)で良いでしょう。。。

最終的にunsigned char型は、0?255までを表すことができるのです。
(そもそも使い方を誤っている気もするけれど...^^;)


そこに整数の18を代入しました。

その後、その変数の値によって年齢を判定します。



動きそうな感じがしますが。。。
いや、まあコンパイルは出来ます。そして動作もします。(「あなたは未成年!」と出る)
けれど、コンパイル時に上の警告(warning)が出るんです。



実は、『 0 <= x 』という条件式が原因らしいのです。
試しに『 1 <= x 』に変更してコンパイルすると、警告は出ません。



考えてみれば当たり前の話なんですが、
unsigned char型では負の数を扱いません。絶対に。
なので、『 0 <= x 』という条件式は不要なのです。(絶対にTrueになるから。)

すなわち『 0<=x && x<=19 』ではなく『 x<=19 』だけで良いのです。


確かに、これを修正するとコンパイル時の警告はなくなります。




...でも、これってどうなんでしょう。気が利きすぎてませんか??^^;;

「必ず真になるよ!」と示してくれる...ということは、

条件式に『 1 == 1 』なんて入れたら、もちろん警告でますよね??
(1と1は等しいかな?...そりゃ等しいわ。)


...と思って、『 1 == 1 』の条件式を入れてコンパイルすると、
なんと、警告が出ないんですよね。




なんじゃこの中途半端な。。。(--;;






スミマセン...特にオチはありません。これで終了です。


ちなみに、変数xをunsigned int型にすると、警告は出ません。
(なんでやねん! 負数にならんことはわかりきっているのに何故出さん?!)

なんて摩訶不思議な。。。
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

テーマ : プログラミング /  ジャンル : コンピュータ

コメントの投稿

非公開コメント

カテゴリー
ようこそ!
Author: Torasuke
Profile: 地元大学の情報系学部に息をひそめる二回生。
   SA SW


ブログ内検索
最近のコメント
オススメ
京都の大学生のラボブログ
Python,Java,Objective-C,GAE,Macなど
Python独習中の大学生のブログ


ltzz.info
ここの管理者さんには謁見済み!(えっ

 Use OpenOffice.org
無補償でも良いなら、MSOfficeよりOpenOfficeで十分です。

Mozilla Firefox ブラウザ無料ダウンロード
当サイトは、Firefoxというブラウザで動作確認しています。私は以前、IE派でしたが、一度乗り換えて慣れてしまうと、Firefoxのほうが便利だということを実感しました。

是非よろしくお願いします。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。