文字定数と文字列リテラルについても、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言語では、終端のナル文字が格納されることなく、コンパイルできてしまいます。

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


↑ C++98プログラマーのためのC89入門