ページ 11

C言語のキャストについて

Posted: 2017年2月19日(日) 01:51
by Nior
C言語のキャストについての質問です。

型の変換だと聞いたのですが、

コード:

 int a = std::atoi("123");

文字列から数値へ変換しています。
これをキャストと呼ぶのでしょうか?

Re: C言語のキャストについて

Posted: 2017年2月19日(日) 02:51
by inemaru
言葉としての意味なのか、プログラム用語としてなのかで変わる気がします。

言葉の意味で考えると、変換を行うのでキャストですが、
プログラム的な意味では、タイプキャストではないので、違うと思います。

Re: C言語のキャストについて

Posted: 2017年2月19日(日) 07:19
by みけCAT
Nior さんが書きました:

コード:

 int a = std::atoi("123");
これはC言語としては不正なコードです。
Nior さんが書きました:C言語のキャストについての質問です。
C++の間違いではないですか?

Re: C言語のキャストについて

Posted: 2017年2月19日(日) 13:35
by Nior
ご意見ありがとうございます。
具体的な例が余計だったでしょうかね。

C言語(C++でもいいです)のキャストをする事によって、メモリの値が書き換わる事がありますか?
という質問です。

Re: C言語のキャストについて

Posted: 2017年2月19日(日) 17:50
by inemaru
先に、気になった点。
Nior さんが書きました:C言語のキャストについての質問です。

型の変換だと聞いたのですが、

コード:

 int a = std::atoi("123");

文字列から数値へ変換しています。
これをキャストと呼ぶのでしょうか?
Nior さんが書きました: C言語(C++でもいいです)のキャストをする事によって、メモリの値が書き換わる事がありますか?
という質問です。
質問内容が変わっていませんか?
(これはキャストですか?→キャストしたらメモリ書き換わりますか?)

[hr]
Nior さんが書きました: C言語(C++でもいいです)のキャストをする事によって、メモリの値が書き換わる事がありますか?
という質問です。
C++であれば、

変換した結果を得るために、キャストしているので
結果が格納されるメモリは、もちろん書き換わるでしょう。

基本的には、キャストによって、キャスト元のメモリは書き換わりませんが
キャストの結果を受け取るメモリは、書き換わると考えれば良いと思います。

ただ、少なくとも初めに提示しているコードは、キャストではなく関数から値を取得しているだけなので、
やはり、質問内容が見えてこないです。

Re: C言語のキャストについて

Posted: 2017年2月19日(日) 21:38
by みけCAT
Nior さんが書きました:C言語(C++でもいいです)のキャストをする事によって、メモリの値が書き換わる事がありますか?
「キャストをする」の定義が「キャスト演算子を使う」だとすると、
C++でオーバーロードされたキャスト演算子を使うことで、メモリの値が書き換わることはあります。
(そのようなコードはあまり良くないと思いますが)

コード:

#include <iostream>

struct hoge {
	int a;

	// キャスト演算子のオーバーロード
	operator double() {
		return ++a;
	}
};

// レジスタや即値ではなくメモリを使ってくれる可能性を上げるため、staticでないグローバル変数にする
hoge test;

int main(void) {
	test.a = 0;
	// 現在の値を表示する
	std::cout << "test.a = " << test.a << '\n';
	// キャスト演算子を使う
	(double)test;
	// メモリの値が書き換わっていることを確認する
	std::cout << "test.a = " << test.a << '\n';
	return 0;
}
参考:キャスト演算子のオーバーロード - Life like a clown

Re: C言語のキャストについて

Posted: 2017年2月20日(月) 00:32
by Nior
ご意見大変参考になりました。
ありがとうございました。