web-dev-qa-db-ja.com

命令型プログラミング言語での型のキャストと変換には違いがありますか?

StackOverflowの discussion で質問が出ました。

castconvertの2つの概念間に明確な違いはありますか?オブジェクトのタイプ)、またはこれら2つの単語はまったく同じですか? C++以外の言語はどうですか、Python and Java?[〜#〜] edit [〜#〜]:問題の型がintからfloatのようなプリミティブ型である場合はどうなりますか?

8
krlmlr

理論的に言えば、2つの概念は大きく異なります:

Type Castingは、あるタイプ(大まかに言えば、オブジェクト構造)を別のタイプに交換することを指しますが、Type Conversionは、値(大まかに言えば、オブジェクトのコンテンツ)の変換を指します。新しいタイプに属するものとして解釈される可能性があること。 理論的には、彼らは決して混合しません

つまり、実際に言えば、あなたがすることができます別のものなしで、ほとんどの場合、それは悪い考えです。オブジェクトの内容を変更せずに、オブジェクトの構造の認識を変更することはほとんど意味がありません。 実際には、ほとんど常に同じです

5
blueberryfields

「キャスト」と「変換」という言葉の定義は言語によって異なります。この質問は、特定の言語を参照すること以外には意味がないと思います。

たとえば、Cでは、「キャスト」という用語は、変換される式の前の括弧内の型名で構成される明示的なキャスト演算子のみを適切に指します。 「変換」は、あるタイプの値を別のタイプの値に変換します。 some変換は、表現を構成するビットを再解釈することによって実装されますが、値から値への変換として定義されています。 (はい、それはポインター変換でも同じです。異なるポインター型が異なる表現を持つことは可能です。)

Cには「暗黙のキャスト」などはありません。

一部の変換は明示的であり、キャスト演算子によって指定されます。他のものは暗黙的であり、あるタイプの式が、別のタイプの式を必要とするコンテキストで使用される場合に適用されます。実行される変換は、どちらの場合でもまったく同じです。

例えば:

double x = 1.23;
int y = (int)x;  /* A cast, or explicit conversion, setting y to 1 */
int z = x;       /* An implicit conversion, setting z to 1. */

C++も同様です。 Cと同じキャストと変換があり、Cスタイルのキャスト式に相当する関数表記と、さらに4つのより具体的なキーワードを追加します:const_castdynamic_castreinterpret_caststatic_cast

3
Keith Thompson

キャスト中、あるクラスのインスタンスを別のクラスのインスタンスであるかのように読み取ります。このクラスのペアに適用できるかどうかは不明です。チェック以外のランタイム作業はありません。多くの場合、コンパイル段階で非互換性が発生する可能性があります。

変換中に、あるクラスのインスタンスのフィールドを別のクラスのインスタンスに再結合または再カウントします。そのための関数がある場合、それはこのまさにそのインスタンスに適用可能かそうでないかです。すべての作業は実行時に行われます。コンパイル中にエラーをチェックできませんでした。

1
Gangnus