0

私は次のようなコードを持っています:

int main(void)
{
    char mychar = 'd';
    int *ptr = malloc(sizeof(*ptr)) ;

    *ptr = (char) 'c' ; // *ptr = (char*) 'c'; Gives the exact same result

    printf("%c\n",*ptr);
    memset(ptr,mychar,sizeof(*ptr));
    printf("%c\n",*ptr);
    free(ptr);
    printf("%c\n",*ptr);
    return 0 ;
}

このコードは、ポインタースタイルのキャストとデータ型のキャストで同じ結果をもたらします。
2つのスタイルのうち、どちらを使用する必要があるか、または良い習慣と見なされるのか、またその理由は何ですか。

*ptr = (char) 'c' ; 
*ptr = (char*) 'c';
4

2 に答える 2

7

ない。

*ptrとは両方とも'c'タイプintです。キャストは必要ありません。

(はい、Cの文字定数は型intであり、ではありませんchar。これは直感に反しますが、歴史的な理由があります。C++の文字定数は型であることに注意してくださいchar。)

キャストイン*ptr = (char) 'c';は比較的無害です。intの値を'c'に変換しchar、結果は暗黙的にに変換されintます。cとして表現できることが保証されているためchar、エラーが発生することはありません。

*ptr = (char*) 'c';、コンパイラはエラーメッセージを表示するはずです。int数値をポインターに変換してから、そのポインター値をintキャストなしでに割り当てます。これは「制約違反」であり、準拠するコンパイラーがそれを診断する必要があることを意味します。そうでない場合は、そうする方法を見つけてください。

割り当てがコンパイラーを通過した場合、それはあなたが望むことをするかもしれません。整数型とポインタ型の間の変換は、通常、表現に名前を付けるビットを再解釈するだけなので、をaに変換intし、char*に戻すとint、元のint値が得られる可能性があります。しかし、それは保証されていません。

異なる算術タイプ間でも、通常、キャストは不要です。たとえば、次のように書いた場合:

char ch = 'c';
int i;
i = ch;

この場合、割り当ての右側は実際にはタイプcharです。これは、文字定数ではなく、そのタイプのオブジェクトの名前であるためです。割り当ては、の値をタイプからタイプに暗黙的に変換します。あなた書くことができます:chcharint

i = (int)ch;

代わりに、キャストなしで行われたのと同じ変換を指定するだけです。そして、それはエラーが発生しやすいです。コンパイラに処理させるのではなく、型を間違える可能性があります。

一般的にキャストは疑いを持って見る必要があります。

于 2012-09-28T09:15:04.607 に答える
1

どちらも悪いです。

'c'実際にはintです。したがって、キャストする必要はありません。直接割り当てることができます:

*ptr = 'c';
于 2012-09-28T09:12:43.323 に答える