『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