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

Peter Novodvorsky uneex@cs.msu.su
17 Dec 2001 11:35:46 +0300


Greetings.

>>>>> "Mike" == Mike E Matsnev <mike@po.cs.msu.su> writes:

    Mike> On Mon, Dec 17, 2001 at 10:55:07AM +0300, Vladimir Prus
    Mike> 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. Ни у кого стандарта нет? :-)
    Mike> Даа...  Из K&R: ======= Rather more surprising, at first
    Mike> sight, is the fact that a reference to a[i] can also be
    Mike> written as *(a+i). In evaluating a[i], C converts it to
    Mike> *(a+i) immediately; the two forms are equivalent.  =======

Однако про i[a] тут ничего сказано не было.

    Mike> Ну и "abcd"[2]==2["abcd"] В ANSI C это работает, в C++
    Mike> вариант 2["abcd"] запрещен.

см выше.

-- 
Peter Novodvorsky.
Moscow State University, CS faculty -- nidd@cs.msu.su
Debian Project                      -- nidd@debian.org
ALT Linux Team, Russia              -- nidd@alt-linux.net