[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