[Uneex] Re: [Uneex] Что позволяет C

Mike E. Matsnev uneex@cs.msu.su
Mon, 17 Dec 2001 11:33:06 +0300


On Mon, Dec 17, 2001 at 10:55:07AM +0300, Vladimir Prus wrote:
> > Читая документ от том, как надо и не надо оформлять
> > программы на C, наткнулся на следующий образец народного творчества
> >
> >
> >      int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
> >      o, world!\\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
> >       -- Dishonorable mention, Obfuscated C Code Contest, 1984.
> >      Author requested anonymity.
> >
> >
> > Лично меня больше всего поразило выражение вида  int[char*].
> > Как это компиллятор собирает, остается только удивляться.
> 
> Никаких проблем -- char* неявно преобразуется в int. Впрочем, в C++ такое 
> работать не будет... и возможно не будет работать в ANSI C. Ни у кого 
> стандарта нет? :-) 
Даа...
Из K&R:
=======
Rather more surprising, at first sight, is the fact that a reference to a[i] can also be written as *(a+i). In evaluating a[i], C converts it to *(a+i) immediately; the two forms are equivalent.
=======
Ну и "abcd"[2]==2["abcd"]
В ANSI C это работает, в C++ вариант 2["abcd"] запрещен.

/Mike