
No.3ベストアンサー
- 回答日時:
キャストはC言語で型の変換を明示的に行うための手段ですね。
また、(void)printf("hello");のように関数の返り値を利用しないことを明示するのにも使われます。しかし、void*ができて以降、C言語では前者の目的でキャストを使う必要はないのではないと思います。仰る通り、前者の使用用途では「違う型の変数への代入だけど、これは意図したことですよ」ということにも使えます。でも、型変換は代入だけではなく関数の引数となる時も使われるので必ずしも代入とは限りません。
なお、C++と違ってC言語ではvoid*がすべてのポインタに明示的にキャストせずに行き来できるので、近頃はほとんど前者の目的でキャストをしていません。今すぐ使用例として思い浮かぶのはネットワークプログラムを書くときに使うこれくらいでしょう。
| bind(listening_socket, (struct sockaddr *)&sin, sizeof(sin))
しかし、これもPOSIX.1準拠の書き方をすると不要ですから、今時キャストの出る機会は関数の返り値を利用しないことを明示するときくらいでしょうね。昔のmallocの返り値はchar*だったのでキャストが必要でしたが、今時mallocの返り値はvoid*なのでキャスト不要ですし、memmoveのsrc、dstともにvoid*ですし、pthread_createの各スレッド関数がもらう変数はvoid*ですから巷で見かけるキャストの多くは無駄にキャストしていると思います。むしろ、キャストを使ったプログラムを見たら変にC++にかぶれた人が書いたプログラムか、void*がなかった頃の古いプログラムか、単なるキャストの練習かと思ってしまいます。
キャストはC言語の機能でも強力な機能の一つで、下手に使うとコンパイラによる型チェックを壊してバクを見つけにくくするので使わないに越したことはないです。もし、どうしても使わないといけないとしたら設計が間違っていないかもう一度確かめたほうがいいと思います。
他の言語でもキャストは型チェックを弱める強力な言語機能であり、バグの温床なので避ける方向に行っていると思います。C++の場合、実務のコーディング規則ではC言語風の何でも変換できてしまうキャストは許可されないはずです。JavaでもGenericsをいれたあたりでキャストがなくてもほとんどのプログラムが書けるようになったと思いますしね。
No.9
- 回答日時:
一応書いておくと...
関数原型(プロトタイプ)がない関数を呼び出す場合、実引数をキャストしても、既定の実引数拡張によって無意味になる場合があります。
具体的には、関数原型のない関数 foo を呼び出す際に、
foo((char)a, (char)b);
のようにchar型にキャストしたとしても、既定の実引数拡張によって、各実引数は通常int型に暗黙的に型変換されます。
ただし、sizeof(char) == sizeof(int) かつ char型が符号無しの処理系では、int型ではなくunsigned int型に型変換されます。
No.8
- 回答日時:
プロトタイプ宣言の無い関数への引数の受け渡し時にもコンパイル結果が違ってきます。
例えば
char foo(char a, char b)
{
return a + b;
}
と言う関数があった場合、他のソースからこの関数を呼び出す時にプロトタイプ宣言していないと
int x, y;
x = foo(1, 2);
と呼び出すと期待した動きをしませんが、
y = foo((char)1, (char)2);
だと正常に動きます。
ただ、キャストの問題というよりもプロトタイプ宣言は必ずしましょうという例ですが。
No.7
- 回答日時:
> そうすると疑問があります。
> ・objには各変数の型情報があるのでしょうか?
> ・もしくはコンパイラに「この計算は浮動小数点型で行う」という意味で解釈され、
> 変換されるのでしょうか?
> (浮動小数点演算という意味のアセンブラに変換されて、バイナリになる?)
コンパイラの出力結果を調べてみるのが、一番納得できると思います。
No.6
- 回答日時:
「ふつ~のプロセッサ」だと, 整数演算と浮動小数演算とでは異なる命令です.
No.4
- 回答日時:
> 「違う型の変数への代入だけど、これは意図したことですよ」
> ってことを分かってもらうための手段という認識でよろしいでしょうか?
違います。
もしそうだとすると、次のような例は説明がつきません。
int a = 1;
int b = (double)a / 2 * 2;
回答ありがとうございます。
(double)a / 2 で左辺がdouble型であるため、1.0 / 2.0となり
結果が0.5になって、0.5 * 2で変数bは1になると思います。
そうすると疑問があります。
・objには各変数の型情報があるのでしょうか?
・もしくはコンパイラに「この計算は浮動小数点型で行う」という意味で解釈され、
変換されるのでしょうか?
(浮動小数点演算という意味のアセンブラに変換されて、バイナリになる?)
どなたか教えてくださいませ。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語について。 5 2023/06/27 18:37
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- 金銭トラブル・債権回収 お店での契約違反で返金請求 2 2022/04/19 16:39
- 英語 再帰代名詞の使用及び不使用条件について 2 2022/10/17 11:28
- C言語・C++・C# キャスト演算について。 1 2023/07/15 15:28
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 飲食業・宿泊業・レジャー 夜のお仕事をしている方にお聞きしたいのです。 2 2022/11/27 16:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
関数の引数の順番の混乱を回避...
-
「#undef」と「#define」の使い...
-
異なる構造体のデータのコピー
-
VBAにてcolorindexを変数に格納...
-
long型のデータをバイト型の配...
-
FileTimeToSystemTime がコンパ...
-
typedefをプログラム中で解除す...
-
構造体の初期化方法について
-
VBAの変数のデータ型を変更する...
-
charとucharの違い
-
VBでも構造体が使えますか?
-
構造体のデータを丸ごとコピー...
-
値が代入されてない時
-
関数から配列を返すには?
-
C言語 配列の長さの上限
-
CStringからchar*への型変換に...
-
C言語のポインタに直接アドレス...
-
配列の要素数に変数を入れたい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報