[解決済み] 2つの文字列リテラルを連結する
質問
Koenig著のAccelerated C++を読んでいます。彼は、新しい考え方は、文字列と文字列リテラルを連結するために + を使用できること、あるいは、2 つの文字列 (ただし、2 つの文字列リテラルは不可) を連結できることであると書いています。
なるほど、これは理にかなっていますね。では、これを明らかにするための 2 つの別々の演習に移ります。
次の定義は有効ですか?
const string hello = "Hello";
const string message = hello + ",world" + "!";
さて、上記を実行してみたところ、うまくいきました! というわけで、嬉しかったです。
そして、次の練習をしてみました。
const string exclam = "!";
const string message = "Hello" + ",world" + exclam;
これはうまくいきませんでした。今、私はそれがあなたが2つの文字列リテラルを連結することができないという事実と関係があることを理解していますが、私はなぜ私が動作するように最初の例を得ることができたかの意味上の違いを理解していません(",world" と "!" 2文字列リテラルではないでしょうか?これは動作しないはずですか?)、しかし2番目は動作しない。
どのように解決するのですか?
const string message = "Hello" + ",world" + exclam;
は
+
演算子は左から右への連想性を持つので、同等の括弧付き表現は次のようになります。
const string message = (("Hello" + ",world") + exclam);
見ての通り、2つの文字列リテラル
"Hello"
と
",world"
が最初に追加されるため、エラーが発生します。
連結される最初の2つの文字列のうち、1つは
std::string
オブジェクトでなければなりません。
const string message = string("Hello") + ",world" + exclam;
あるいは、2番目の
+
を括弧でくくることで、2番目の
const string message = "Hello" + (",world" + exclam);
最初の例(
hello + ",world" + "!"
) が機能するのは
std::string
(
hello
) は、一番左の
+
. その
+
が評価されると、その結果は
std::string
オブジェクトとなり、その結果得られた
std::string
に連結されます。
"!"
.
については
なぜ
を使って二つの文字列リテラルを連結することはできません。
+
を使うことができないのは、文字列リテラルが単なる文字の配列であるからです (a
const char [N]
ここで
N
は文字列の長さに1を足したもので、ヌルターミネータを意味します)。 ほとんどの文脈で配列を使用する場合、配列はその初期要素へのポインタに変換されます。
ですから、あなたが
"Hello" + ",world"
を行おうとすると、実際に行おうとしていることは、2つの
const char*
を一緒に追加することですが、これは不可能であり(2 つのポインタを一緒に追加することは何を意味するでしょうか)、もし可能であれば、それはあなたがそれを望んでいたことを実行しないでしょう。
あなたは は は、文字列リテラルを隣り合わせにすることで連結することができます。例えば、次の二つは等価です。
"Hello" ",world"
"Hello,world"
これは、長い文字列リテラルを複数行に分割したい場合に便利です。 しかし、それらは文字列リテラルでなければなりません。
const char*
のポインタや
const char[N]
配列になります。
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】'cout'は型名ではない
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない