ホームページ  >  記事  >  バックエンド開発  >  C で文字列リテラルと文字を連結すると未定義の動作が発生するのはなぜですか?

C で文字列リテラルと文字を連結すると未定義の動作が発生するのはなぜですか?

DDD
DDDオリジナル
2024-10-25 05:37:29190ブラウズ

Why Does Concatenating String Literals and Characters in C   Cause Undefined Behavior?

C での文字列と文字の連結

C で文字列と文字を連結すると、予期しない動作が発生する可能性があります。これを理解するために、次の例を見てみましょう。

<code class="cpp">string str = "ab" + 'c';
cout << str << endl;</code>

ここでは、文字列「ab」に文字「c」を追加します。ただし、結果は未定義の動作となり、一見ランダムな出力になります。

この動作は、文字列リテラル ("ab") と文字リテラル ('c') のデフォルトの演算子が欠如していることが原因です。代わりに、コンパイラは「ab」を C スタイルの文字列として解釈し、「c」を int に変換します。次に int が文字列リテラルのアドレスに追加されるため、その境界外のメモリにアクセスし、null 文字が見つかるまで予期しない文字が出力されます。

この問題を回避するには、文字列リテラルを明示的に次のようにキャストします。文字列:

<code class="cpp">string str = std::string("ab") + 'c';</code>

または、連結を使用できます:

<code class="cpp">string str = "ab";
str += 'c';</code>

対照的に、「ab」がすでに作成された文字列である 2 番目の例は、期待どおりに機能します:

<code class="cpp">char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;</code>

文字列クラスには通常、連結を直観的に処理するオーバーロードされた演算子があります。

以上がC で文字列リテラルと文字を連結すると未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。