今日、私は次のような奇妙な構文を見つけました
int _$[:>=<%-!.0,};
古いコードではありますが、実際にはコードはコメント化されていません。この行のコンパイル エラーは報告されていないようです。別途テストしましたが、コンパイルもできました:
int main(){
int _$[:>=<%-!.0,};
return 0;
}
なぜコンパイルできるのでしょうか?
ベストアンサー1
と有向グラフ(下記参照) 行は次のように変換されます。
int _$[]={-!.0,};
右側では、.0
はdouble
リテラル、!
は論理否定演算子、-
は算術否定演算子、 は,
末尾のコンマです。これらを合わせると{-!.0,}
配列初期化子になります。
左側は配列int _$[]
を定義していますint
。しかし、最後の問題が1つあります。_$
標準Cでは有効な識別子ではありません。一部のコンパイラ(例:グーグル) は拡張機能としてサポートしています。
C11 §6.4.6 句読点
言語のあらゆる側面において、6つのトークンは
<: :> <% %> %: %:%:
それぞれ6つのトークンと同じように動作します
[ ] { } # ##