[C/C++] Cプログラミングの落とし穴 1.3 食いしん坊な語彙解析 P8

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

コンパイラはトークンを読み取る際、解釈可能な最大長のトークンを取り出そうとします。

例えば、z = y/*xのような式では、/*を一つのトークンとして認識するためコメントの始まりであると解釈します。

現在はインテリセンスが自動的にコメントとして解釈しコードの色を変えるのですぐにわかりますが、このまま強引にコンパイルしてもちゃんと指摘されます。

この式をコンパイラに正確に読み取らせるには、z = y/ *xのように/と*の間に半角スペースを挟むか、z = y/(*x)のようにカッコで囲みます。タブや改行を挟んでも問題なく動作します。

// 間違ったコード
int main()
{   
    int x;
    int y = 50;
    int* ptr;

    ptr = &x;
    *ptr = 20;

    auto z = y/*ptr;

    printf("z = %d\n",z);

}
--------------------------------------------------
出力
--------------------------------------------------
src/test.cpp:13:15: error: unterminated /* comment
    auto z = y/*ptr;
              ^
src/test.cpp:13:15: error: expected ';' at end of declaration
    auto z = y/*ptr;
              ^
              ;
src/test.cpp:17:2: error: expected '}'
}
 ^
src/test.cpp:5:1: note: to match this '{'
{   
^
3 errors generated.
// 正しいコード
int main()
{   
    int x;
    int y = 50;
    int* ptr;

    ptr = &x;
    *ptr = 20;

    auto z = y/ *ptr;
    // あるいは
    // auto z = y/(*ptr);

    printf("z = %d\n",z);

}
--------------------------------------------------
出力
--------------------------------------------------
z = 2