6

奇妙なコードに出くわしました。C のようには見えませんが、驚いたことに、私の C コンパイラでコンパイルして実行できます。これは C 言語の非標準拡張機能ですか? もしそうなら、その理由は何ですか?

??=include <stdio.h>

int main()
??<
  const char arr[] = 
  ??<
    0xF0 ??! 0x0F,
    ??-0x00,
    0xAA ??' 0x55
  ??>;

  for(int i=0; i<sizeof(arr)/sizeof(*arr); i++)
  ??<
    printf("%X??/n", (unsigned char)arr??(i??));
  ??>

  return 0;
??>

出力:

FF
FF
FF
4

1 に答える 1

14

コードは、C 標準のすべてのバージョンに完全に準拠しています。この??メカニズムはトライグラフと呼ばれ、特定のシンボルを印刷する別の方法を可能にするために C に導入されました。プログラムは、さまざまなトライグラフ シーケンスのデモンストレーションとして作成されたようです。

当時、多くのコンピューターとそのキーボードは、 ISO 646と呼ばれる古いシンボル テーブルに基づいていました。これには、C 言語で使用されるすべてのシンボル ( \ { } [ ]. これにより、一部の国のプログラマーは C を書くことさえできなくなりました。その国のキーボード レイアウトには必要な記号が欠けていたからです。キーボードとシンボル テーブルを作り直す代わりに、C 言語が変更されました。

したがって、トライグラフが導入されました。現在、これらは完全に廃止された機能と見なされており、使用することはお勧めできません。たとえば、GCC を使用すると警告が表示されます。それでも、下位互換性のために C 標準に残っており、すべての C コンパイラがそれらをサポートする必要があります。

既存のトライグラフ シーケンスは次のとおりです (C11 5.2.1.1 トライグラフ シーケンス)。

??=  #
??(  [
??/  \
??)  ]
??'  ^
??<  {
??!  |
??>  }
??-  ~

左の列はトライグラフ シーケンスで、右の列はその意味です。

于 2014-05-23T09:29:50.043 に答える