int _$[:>=<%-!.0,}; はなぜコンパイルできるのでしょうか? 質問する

int _$[:>=<%-!.0,}; はなぜコンパイルできるのでしょうか? 質問する

今日、私は次のような奇妙な構文を見つけました

 int _$[:>=<%-!.0,};

古いコードではありますが、実際にはコードはコメント化されていません。この行のコンパイル エラーは報告されていないようです。別途テストしましたが、コンパイルもできました:

int main(){
    int _$[:>=<%-!.0,};
    return 0;
}

なぜコンパイルできるのでしょうか?

ベストアンサー1

有向グラフ(下記参照) 行は次のように変換されます。

int _$[]={-!.0,};

右側では、.0doubleリテラル、!は論理否定演算子、-は算術否定演算子、 は,末尾のコンマです。これらを合わせると{-!.0,}配列初期化子になります。

左側は配列int _$[]を定義していますint。しかし、最後の問題が1つあります。_$標準Cでは有効な識別子ではありません。一部のコンパイラ(例:グーグル) は拡張機能としてサポートしています。


C11 §6.4.6 句読点

言語のあらゆる側面において、6つのトークンは

<: :> <% %> %: %:%:

それぞれ6つのトークンと同じように動作します

[  ]  {  }  #  ##

おすすめ記事