[C/C++] Cプログラミングの落とし穴 1.5 文字列と文字定数 P10

『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

この本ではC言語の特異性が論じられていてとても興味深いのですが、1.5もなかなかのインパクトでした。

単一引用符で1文字を囲むとASCIIコードになり、二重引用符で囲むと文字列へのポインタになるというのは目からウロコでした。string型は*が付いていなくてもポインタとしての性質を持つということになりますね。

今使っているclangコンパイラでは単一引用符で1文字を囲むとcharになり、複数文字を囲むとintつまりASCIIコードになります。

普段文字列を囲むときは二重引用符しか使いませんが、あえて単一引用符を使うと以下のようなコンパイルエラーになります。

int main() {
    string str1 = 'a';
    string str2 = 'abc';

    cout << "str1 " << str1 << endl;
    cout << "str2 " << str2 << endl;

    printf('a\n');

    return 0;
}
--------------------------------------------------
コンパイルエラー内容
--------------------------------------------------
src/test.cpp:4:12: error: no viable conversion from 'char' to 'std::string' (aka 'basic_string<char>')
    string str1 = 'a';
           ^      ~~~
src/test.cpp:5:12: error: no viable conversion from 'int' to 'std::string' (aka 'basic_string<char>')
    string str2 = 'abc';
           ^      ~~~~~
src/test.cpp:10:5: error: no matching function for call to 'printf'
    printf('a\n');
    ^~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdio.h:170:6: note: candidate function not viable: no known conversion from 'int' to 'const char *' for 1st argument
int      printf(const char * __restrict, ...) __printflike(1, 2);
         ^