第9回 文字定数と文字列リテラル

文字定数と文字列リテラルについても、C++とC言語では微妙なちがいがあります。また、C++では「文字リテラル」といいますが、C言語では「文字定数」という用語が使われています。

文字定数

C++の文字リテラルは char 型でしたが、C言語の文字定数は int 型です。C言語では多重定義(オーバーロード)がありませんので、sizeof 演算子のオペランドに文字定数を指定しないかぎり、この違いが問題になることはとくにないでしょう。

C言語でも、ワイド文字定数は wchar_t 型です。しかし、wchar_t 型自体が基本型ではなく、実体は一般の汎整数型ですので、その意味ではC++とは異なります。しかし、これも具体的に問題になることはまずないでしょう。

文字列リテラル

C++の文字列リテラルは const char 型の配列でしたが、C言語の文字列リテラルは char 型の配列です。しかし、文字列リテラルの各要素に書き込んだ場合の動作は未定義です。

文字列リテラルによる配列の初期化

文字列リテラルを使った配列の初期化では、C++とC言語では微妙な違いがあります。C++では、3要素しかない配列を3文字の文字列リテラルで初期化しようとするとエラーになりました。しかし、C言語では、終端のナル文字が格納されることなく、コンパイルできてしまいます。

char s[3] = "abc";  /* OK */

上記のコードは、{ 'a', 'b', 'c' } を初期化子にした場合と同じ結果になります。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/571