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

Vladimir Prus uneex@cs.msu.su
Tue, 18 Dec 2001 19:57:14 +0300


Mike E. Matsnev wrote:
> 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"] запрещен.

Оказывается нет... std::5.2.1 и std::13.6.13 говорят, что в С++ это тоже 
должно работать -- и оно в самом деле работает?

- Volodya