3

これは ioccc で見ました。

    int i;
    main()
    {
        for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hello, world!\n",'/'/'/'));
    }
    read(j,i,p)
    {
        write(j/p+p,i---j,i/i);
    }

「hello world!」と表示されます。gcc でコンパイルすると、Visual Studio 12 で動作するかどうか不明です。

4

3 に答える 3

0

まず、これをもう少しうまくフォーマットしましょう。

int i;


main()
{
   for(;i["]<i;++i){--i;}"];
       read('-'-'-',i++ + "hello, world!\n",'/'/'/'));
}


read(j,i,p)
{
  write(j/p+p,i---j,i/i);
}

次に、実際に何をするかを見てみましょう。

for(;i["]<i;++i){--i;}"];

と同じです

for(;"]<i;++i){--i;}"[i];

したがって、初期化は行われず、インデックス付きの「C コード」の文字列がiゼロでない限り。

次に、for ループの更新部分が続きます。

read('-'-'-',i++ + "hello, world!\n",'/'/'/'));

'-'-'-'と同じようにゼロです'a'-'a'i++ + "hello, world!"はポインタ + オフセットであり、もちろん 'i' を更新します。そして最後の部分は、何かをそれ自体で割り、1 を作ります。

最後のトリックは、readwrite を呼び出す再定義された関数です。

read(j,i,p)
{
  write(j/p+p,i---j,i/i);
}

そして、同様のトリックを使用して、stdoutwith j/p+p (上から p = 1、j = 0、つまり 0/1+1 = 1) の値と、書き込むデータの長さ (1) を生成します。書く文字はi-- -j、 をするi前に取っ--ているので、効果はありません[グローバルiではなく、ローカルのものを使用していreadます。

于 2013-06-08T13:05:50.767 に答える