プロが教えるわが家の防犯対策術!

VC9.0を使っているのですが、以下のような文を書くと
警告が出てしまいます。

int i = 100;

//warning C4305: '初期化中' : 'int' から 'bool' へ切り詰めます。
bool a = i;

この警告を出力させないために以下のようにすることに
問題はないでしょうか?

int i = 100;
bool a = static_cast<bool>(i);

このキャストを行うとき、iの値が0ならaはfalse,
iの値が0以外ならaはtrueとなることは保証されるのでしょうか?

よろしくお願いいたします。

A 回答 (6件)

横槍ですが...



> 処理系によってはboolの内部実装にunsigned charを使っていて、
> 256を入れるとオーバーフローして0になってしまうことがあるということでしょうか?

標準規格ができる前の古い処理系や、非標準処理系(つまり方言)の場合は何が起こっても不思議ではありません。

ちなみに、System.Bool云々の話はC++/CLI(これもある意味方言)と混同している可能性があるので鵜呑みにしないこと。
    • good
    • 0

> デバッガで見てみましたが、256を入れてもtrueになりました。



boolって、unsigined charだったはずと思ってたけど、Visual C++ 2008 Express Editionで試したら、System.Boolに変換されてました。

だめですね、昔の知識で回答しちゃ。
    • good
    • 1
この回答へのお礼

すみません。わからない点があるので聞かせてください。

おっしゃられているのは、処理系によってはboolの内部実装にunsigned charを使っていて、
256を入れるとオーバーフローして0になってしまうことがあるということでしょうか?
これだと、bool型がもとからあるC++だと問題にはならないと思うのですが、
その認識であっていますでしょうか?

それとも、Cにおいてbool型をみかけ上作るために、
typdef unsigned int bool;
となっていることがたまにあり、その際にトラブルになるということでしょうか?

お礼日時:2008/04/23 00:54

> iの値が0以外ならaはtrueとなることは保証されるのでしょうか?



保証されます。
    • good
    • 0
この回答へのお礼

安心しました。
ありがとうございます。

お礼日時:2008/04/22 00:31

int i = 256;


だと、falseになりそうな。

この回答への補足

ありがとうございます。
デバッガで見てみましたが、256を入れてもtrueになりました。
ひょっとして処理系依存でたまたまtrueになっているだけなのでしょうか。
falseになりそうな理由を教えてもらえないでしょうか?

補足日時:2008/04/21 00:31
    • good
    • 0

僕なら素直に



int i = 100;
bool a = (i != 0);
    • good
    • 1
この回答へのお礼

ありがとうございます。
なるほど。そのやり方の方がいいですね。

お礼日時:2008/04/21 00:35

>このキャストを行うとき、iの値が0ならaはfalse,


>iの値が0以外ならaはtrueとなることは保証されるのでしょうか?

なるけど、その前に 100 を bool 型の変数に代入する必要が本当にあるのかを考え直した方がいい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
おっしゃる通りです。

お礼日時:2008/04/21 00:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A