C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で文字列リテラル同士を連結するとどうなる?正しい連結方法を解説

C++における文字列と文字列リテラルには、いくつか重要な性質があります。この記事では、C++で2つの文字列を連結する際に覚えておくべきポイントを、具体例とともに解説します。

文字列連結の基本ルール

  • x + y という式で文字列を連結する場合(x と y がどちらも std::string 型)、結果は「x の文字列のコピーの後ろに y の文字列が続いたもの」となります。

  • x と y のうち、片方だけは文字列リテラルや文字であっても構いません。しかし、両方が文字列リテラルの場合は連結されず、コンパイルエラーになります。

コンパイルエラーになる例

#include<iostream>
using namespace std;
int main(){
    cout << "Hello " + "World";
}

実行結果

両方のオペランドがリテラルであるため、
上記のコードはコンパイルできません。

エラーが発生するのは、演算子 +左結合性(left associativity)を持つためです。"Hello " + "World" の部分が先に評価されますが、文字列リテラルは内部的にはポインタ(配列)であるため、リテラル同士を + で足すことはC++では許されていません。その結果、コンパイラがエラーを返します。

正しく動作する例

連結対象のどちらか一方が std::string 型であれば、問題なく動作します。

#include<iostream>
using namespace std;
int main(){
    string my_str = "Hello ";
    cout << my_str + "World";
}

実行結果

Hello World

このように、少なくとも一方が std::string オブジェクトであれば、operator+ が適切に呼び出され、意図した通りの文字列連結が行われます。

なお、C++14以降では using namespace std::literals; を宣言することで s サフィックスを使えるようになり、"Hello "s + "World"s のように、リテラルのままでも std::string 同士として連結できます。状況に応じて使い分けると良いでしょう。

  1. C++で文字列sをtに変換するための最小変更回数を求める

    問題の概要 同じ長さを持つ2つの文字列 s と t があり、どちらも小文字の英字のみで構成されているとします。まず文字列 s を任意の順序に自由に並べ替え、その後、s を t と一致させるために必要な最小の文字置換回数を求めます。 例えば、入力が s = eccynue、t = science の場合、答えは 2 になります。これは、eccynue を yccence に並べ替えた後、先頭の y を s に、2番目の c を i に置き換えることで science に変換できるためです。 解決のためのアプローチ この問題の鍵となるのは、並べ替えによって一致させられる文字はできるだけ多く一致

  2. C++で2つの2進数文字列を加算するプログラムの書き方

    2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁