3

コードで名前付き定数を使用する場合、暗黙的な型変換を削減しようとしています。たとえば、使用するのではなく

const double foo = 5;

私は使うだろう

const double foo = 5.0;

そのため、型変換を行う必要はありません。しかし、私がこのようなことをする表現では...

const double halfFoo = foo / 2;

その 2 は整数として評価され、暗黙的に変換されますか? 代わりに 2.0 を使用する必要がありますか?

4

3 に答える 3

6

2double であるため、暗黙的に double に変換されfooます。fooが整数の場合、整数除算が実行され、結果が に格納されるため、注意が必要ですhalfFoo

常に浮動小数点リテラルを使用することは良い習慣だと思います (たとえば2.02.浮動小数点値として使用する予定の場所ならどこでも)。より一貫性があり、この種のことで発生する可能性のある有害なバグを見つけるのに役立ちます。 .

于 2009-11-25T18:52:37.787 に答える
2

これはType Coercionとして知られています。ウィキペディアには、それについて少し良いことがあります。

強制型変換とも呼ばれる暗黙的な型変換は、コンパイラによる自動型変換です。一部の言語では、コンパイラが強制を提供することを許可するか、必要とすることさえあります。

混合型式では、プログラムが正しく実行されるように、実行時に必要に応じて 1 つ以上のサブタイプのデータをスーパータイプに変換できます。

...

意図しない結果が生じる可能性があるため、この動作は注意して使用する必要があります。浮動小数点値の小数部分が切り捨てられる (切り捨てられる) ため、浮動小数点表現が整数表現に変換されると、データが失われる可能性があります。逆に、整数表現から浮動小数点表現に変換すると、精度が失われる可能性があります。これは、浮動小数点型が整数を正確に表現できない可能性があるためです (たとえば、float は IEEE 754 単精度型であり、正確に整数 16777217 ですが、32 ビット整数型は可能です)。これにより、integer 型と real 型の 2 つの変数に同じ整数値が格納され、等しいかどうかを比較すると false が返されるような状況が発生する可能性があります。

C および C++ の場合、整数型 (つまり、long、integer、short、char) の式の値は、式の中で最大の整数型です。よくわかりませんが、浮動小数点数を含む式で同様のことが起こると思います(浮動小数点値が整数型よりも「大きい」と仮定します)。

于 2009-11-25T18:58:33.687 に答える
2

厳密に言えば、あなたが達成しようとしていることは逆効果のようです。

通常、C プログラム内の明示的な型変換の数を減らし、一般的にはソース コード内のすべての型の依存関係を減らすように努めます。優れた C コードは、可能な限り型に依存しない必要があります。これは一般に、特定の型を綴る明示的な構文要素をできるだけ頻繁に避けることが良い考えであることを意味します。したほうがいい

const double foo = 5; /* better */

よりも

const double foo = 5.0; /* worse */

後者は冗長だからです。C 言語の暗黙的な型変換規則により、前者が正しく機能することが保証されます。比較についても同じことが言えます。これ

if (foo > 0)

よりも良い

if (foo > 0.0)

繰り返しますが、前者の方が型に依存しないためです。

この場合の暗黙的な型変換は非常に良いことであり、悪いことではありません。これは、一般的な型に依存しないコードを記述するのに役立ちます。なぜそれらを避けようとするのですか?

場合によっては、型を明示的に表現する以外に選択肢がないことは事実です (2.0代わりに使用する2など)。しかし、通常は、本当に必要な場合にのみ行います。なぜ誰かが本当の必要性なしにそれをするのかは私を超えています.

于 2009-11-25T19:24:28.953 に答える