metaclass: (Default)
[personal profile] metaclass
Оригинальный код:
((void (*)())0)();

Чтобы понять происходящее, я его сначала откомпилировал, затем дизассемблировал, получилось такое:
xor eax,eax
call eax

Затем я это дело разделил собственно на объявление указателя на функцию и на вызов:

typedef void (*fptr)();

void main(){
((fptr)0)();
}

Особо бесит указание имени объявляемого типа в середине объявления. Очень логично. Это как если бы присвоение var1=var2 в стиле va(=var1)r2;

Date: 2007-01-17 10:27 am (UTC)
From: [identity profile] sbj-ss.livejournal.com
процитирую Богатырёва:

Приведем прием (позаимствованный из журнала "Communications of
the ACM"), позволяющий прояснить смысл описания. Описание на Си переводится в описа-
ние в стиле языка Algol-68. Далее
    ref      ТИП    означает  "указатель на ТИП"
    proc()   ТИП              "функция, возвращающая ТИП"
    array of ТИП              "массив из элементов ТИПа"
    x:       ТИП              "x имеет тип ТИП"

Приведем несколько примеров, из которых ясен и способ преобразования:
    int (*f())();     означает
            (*f())()  :                    int
             *f()     :             proc() int
              f()     :         ref proc() int
              f       :  proc() ref proc() int

то есть f - функция, возвращающая указатель на функцию, возвращающую целое.
    int (*f[3])();    означает
            (*f[])()  :                      int
             *f[]     :               proc() int
              f[]     :           ref proc() int
              f       :  array of ref proc() int

f - массив указателей на функции, возвращающие целые. Обратно: опишем g как указа-
тель на функцию, возвращающую указатель на массив из 5и указателей на функции, возв-
ращающие указатели на целые.

           g          : ref p() ref array of ref p() ref int
          *g          :     p() ref array of ref p() ref int
         (*g)()       :         ref array of ref p() ref int
        *(*g)()       :             array of ref p() ref int
       (*(*g)())[5]   :                      ref p() ref int
      *(*(*g)())[5]   :                          p() ref int
     (*(*(*g)())[5])():                              ref int
    *(*(*(*g)())[5])():                                  int
                         int *(*(*(*g)())[5])();


Помнится, когда-то писал программку, которая по этому алгоритму "раскручивает" навёрнутые описания. А то одни скобочки. Лисп блять.

Date: 2007-01-17 11:35 am (UTC)
From: [identity profile] eu3eu.livejournal.com
Зато этот язык дал миру новый вид искусства, во владении котором состязаются в Obfuscated C Contest. А язык, в общем, красивый и удобный - в нём всё под контролем. А самый угрёбищный из популярных - это Перл.

Date: 2007-01-17 11:50 am (UTC)
From: [identity profile] sbj-ss.livejournal.com
Ура! Холи вор! Чего это он угрёбищный? :(

Date: 2007-01-17 06:17 pm (UTC)
From: [identity profile] inv2004.livejournal.com
читается легко, дело привычки.

Date: 2007-01-17 12:04 pm (UTC)
From: [identity profile] 1ceheart.livejournal.com
Да ну. Конструкции вида той, которая сверху - целиком на совести их авторов, поленившихся - в данном конкретном случае - написать typedef. Тот же автор и на питоне смог бы написать код, который пришлось бы компилить и дизассемблить.

Date: 2007-01-17 01:14 pm (UTC)
From: [identity profile] dpla.livejournal.com
Пишите на Паскале. Всё понятно будет. А приверженцев "Си" надо холокостить холокостом.

Date: 2007-01-17 01:54 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да я пишу на чем попало, а этот мрак просто попался тут по работе.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 23rd, 2025 12:13 am
Powered by Dreamwidth Studios