フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: UnicodeString代入時の','とL","の違い
7of9
メンバー
投稿数: 3
UnicodeString代入時の','とL","の違い
on: 2014/10/23 13:52 Thu

こんにちは。

C++ Builderにてプログラミングをしていて分からなかったことがあります。


String str;

String word1 = L"TEST";
str = word1 + ',' + word1;

上記のようなコードにおいて ','としている部分がありますが、これは本来は L"," と書き換えるべきなのでしょうか?

strはString(UnicodeString)型で宣言していますので、','としていると、AnsiCharからUnicodeの文字への自動変換が入るという理解で正しいでしょうか。

過去に自動変換にて失敗した時があったため、自動変換にならない(減らす)ようにソフトを組みたいと考えています。

googleなどで検索をしてみたのですが、自分が探しているような情報にたどり着けなかったため、質問させていただきました。

セブンオブナインという名前です。 Start Trek Voyagerのボーグという種族のクルーから名前を取っています。

7of9
メンバー
投稿数: 3
Re: UnicodeString代入時の','とL","の違い
on: 2014/10/23 17:22 Thu

いくつか見てみました。


String str;
String word = L"TEST";

// (1)

上記の部分の(1)を


str = L"" + ',' + word;

とした場合、strい格納される値は、{64U, 4U, 84U, 69U, 83U, 84U, 0U} となり、最初の2文字が"@"と"\x04"となるようです。
(上記のコードにおいてL""は余分と言えば余分ですが。。。)

(1)の部分を


str = L"" + L"," + word;

とした場合は、コンパイルエラーが出ます。L"" + L","がおかしいということでした。

(1)の部分を


str = L"" L"," + word;

でも書けますが、この場合は、{44U, 84U, 69U, 83U, 84U, 0U}となり、意図した結果が得られました。

上記、L"" L","は余計なので、L","から初めてよさそうです。

あと、


str = ',' + word;

の場合は、きちんとコンパイルエラーとなります。

セブンオブナインという名前です。 Start Trek Voyagerのボーグという種族のクルーから名前を取っています。

windy
メンバー
投稿数: 3
Re: UnicodeString代入時の','とL","の違い
on: 2014/10/24 23:47 Fri

まず、C++の考え方で文字列を文字の配列として考えた場合、UnicodeStringに含まれる文字の要素はwchar_tです。
最初のコード

str = word1 + ',' + word1;

str = word1 + L',' + word1;

と書くのが正しいです。この場合はどちらで書いても最終的には同じ結果になりますが。

で、次の投稿のコードはどう解釈されるのかというと

str = L"" + ',' + word;
str = ( (L"" + ',') + word);

となり、コンパイラの解釈は、 UnicodeString = ((const wchar_t* + char) + UnicodeString);
という事になり、最初のポインタ演算ででたらめなポインタになっています。
Delphiでは恐らく言語レベルでUnicodeStringを認識していると思いますが、C++ではあくまでC++の言語仕様で解釈されます。
代入先がUnicodeStringだからといって、最初のL""がUnicodeStringに変換されるわけでは無いという事です。

同様に以下のコードは

str = L"" + L"," + word;

UnicodeString = ( (const wchar_t* + const wchar_t*) ) + UnicodeString
として解釈されます

このあたりのことはRAD Studio固有の仕様ではなくC++の規格によるものです。
Effective C++を読むことをオススメします。

7of9
メンバー
投稿数: 3
Re: UnicodeString代入時の','とL","の違い
on: 2014/10/25 08:50 Sat

windy 様

詳しい解説ありがとうございます。

最初のコードはL:,: とすること。 次の投稿のコードの解釈。最後のコードの解釈、色々勉強になりました。

Effective C++は洋書のkindleバージョンを購入しているのですが、最初の4割くらいしかまだ読んでいませんでした。また、読みなおそうと思います。

セブンオブナインという名前です。 Start Trek Voyagerのボーグという種族のクルーから名前を取っています。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.028 sec.