1. Си / Говнокод #29146

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    #include <stdio.h>
    
    struct{int a; float b;} test()
    {
      return (typeof(test())){1337, 666.666};
    }
    
    int main()
    {
      auto a = test();
      printf("%d %f\n", a.a, a.b);
      return 0;
    }

    В стандарт C23 добавили auto и теперь можно писать такую хуйню. В "Clang" работает: https://godbolt.org/z/GG3addqPb

    Запостил: j123123, 17 Июня 2025

    Комментарии (99) RSS

    • А вот в "GCC" - хуй там https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116631
      Ответить
      • Однако если "auto" заменить на "__auto_type", в GCC будет работать. Какой багор )))
        Ответить
        • Значит, в GCC теперь два «auto» с разным поведением на некоторых типах?
          Ответить
          • Да.
            Ответить
            • аУто стандартаки

              а мржно пейсать auto auto(auto auto)?
              Ответить
              • В Си функция не может "принимать" auto
                Ведь если какой-то петух напишет допустим
                int square(auto num) {
                    return num * num;
                }

                то кто-то может вызвать такую говнофункцию с типом "int" а кто-то с типом "double" и это будет две разные функции, а прототип всего один. Короче хуйня какая-то. В Си нет такого, чтоб было несколько функций с одним именем

                И возвращать auto она тоже не может т.к. из прототипа нихуя не ясно, какую хуйню она там может возвращать, и тогда если у нас объявлен лишь прототип
                auto square(int num);
                
                int test()
                {
                  return square(123);
                }

                Компилятору нихуя не будет ясно, какое говно оно вернет. Это тебе даже крестопараша не скомпилирует.

                error: use of 'auto square(int)' before deduction of 'auto'
                Ответить
                • Пичалька
                  Ответить
                • В «C11» есть «_Generic»:

                  #include <stdio.h>
                  #include <stddef.h>
                  #include <stdint.h>
                  
                  #define typename(x) _Generic((x),        /* Get the name of a type */             \
                                                                                                    \
                          _Bool: "_Bool",                  unsigned char: "unsigned char",          \
                           char: "char",                     signed char: "signed char",            \
                      short int: "short int",         unsigned short int: "unsigned short int",     \
                            int: "int",                     unsigned int: "unsigned int",           \
                       long int: "long int",           unsigned long int: "unsigned long int",      \
                  long long int: "long long int", unsigned long long int: "unsigned long long int", \
                          float: "float",                         double: "double",                 \
                    long double: "long double",                   char *: "pointer to char",        \
                         void *: "pointer to void",                int *: "pointer to int",         \
                        default: "other")
                  
                  #define fmt "%20s is '%s'\n"
                  int main() {
                  
                    size_t s; ptrdiff_t p; intmax_t i; int ai[3] = {0}; return printf( fmt fmt fmt fmt fmt fmt fmt fmt,
                  
                       "size_t", typename(s),               "ptrdiff_t", typename(p),     
                     "intmax_t", typename(i),      "character constant", typename('0'),
                   "0x7FFFFFFF", typename(0x7FFFFFFF),     "0xFFFFFFFF", typename(0xFFFFFFFF),
                  "0x7FFFFFFFU", typename(0x7FFFFFFFU),  "array of int", typename(ai));
                  }


                  Увы, можно использовать только в макросах. В функциях нельзя из-за отсутствия перегрузки.
                  Ответить
                  • В «gcc» до «C11» для организации подобного ветвления есть нестандартное расширение __bultins_types_compatible_p:

                    #include <stdio.h>
                    
                    int main(int argc, char **argv) {
                        char *s;
                        if (__builtin_types_compatible_p(__typeof__(s), long)) {
                            puts("long");
                        } else if (__builtin_types_compatible_p(__typeof__(s), char*)) {
                            puts("str");
                        }
                        return (0);
                    };
                    Ответить
              • а в пхп можно
                Ответить
                • В "PHP" не вывод типов, там динамическая питухизация
                  Ответить
                  • Хотя можно конечно придумать некую хуету, чтоб когда вызывается некое говно с какими-то там типами, в рантайме вызывается хуйня которой скармливается тип и некий "AST" или байткод хуиты с этими "auto", и эта хуйня используя JIT генерирует функцию с такими-то типами, но это сложно и не во все контроллеры влезет
                    Ответить
                  • Мало того, что динамическая, она слабая и неявная.

                    «PHP» выводит типы, но во-первых, снаружи ничего не видно (неявность), во-вторых он тут же приведёт тип к другому, если можно (слабость).
                    Ответить
                    • > во-вторых он тут же приведёт тип к другому, если можно (слабость).
                      «Если можно» — это ещё не слабость. Приводить «float» в «double» может и строгий язык, например.
                      Слабость возникает, когда язык позволяет неявно приводить типы с потерей информации — например, массив в строку, — либо с возможными ошибками.
                      Но в целом, это довольно размытые термины без точных границ, поэтому и хрен с ними.
                      Ответить
                      • Антон Михайлович плюнул, сказал "эх", опять плюнул, опять сказал "эх",
                        опять плюнул, опять сказал "эх" и ушел. И Бог с ним. Расскажу лучше про Илью
                        Павловича.


                        Предлагаю ввести термин "ебанутая типизация". Например, когда ты можешь унсигнеду присвоить сигнед, или пойнтеры разных типов присваивать — это слабая; а когда петух складывает строку с числом, а потом делит на число и у него ничего не падает — это ебанутая
                        Ответить
                        • Проверим JS:

                          > 'петух'+42
                          'петух42'
                          > ('петух'+42)/3
                          NaN

                          Ничего не упало, никаких исключений не выкинуло.
                          Ответить
                          • PHP 8.4 при попытке сложить строку с числом кидает исключение TypeError.

                            Кто говорил, что в PHP нету типов?

                            P.S. А если заменить плюс на точку (конкатенацию), то отрабатывает, переводит число в строку: ('петух' . 42) возвращает 'петух42'.

                            Но вот разделить строку на число не может, снова TypeError.
                            Ответить
                          • Можно даже не НаН получить
                            > (2+'1') / 3
                            7
                            > [] + 37
                            "37"
                            > [] / 10
                            0
                            Ладно, понятно что в таком случае макакист сам дурак. Но где вы видели, чтоб не макака?
                            Ответить
                            • А теперь представь, что тут не конь-станты, а выражение вида (a+b)/c, где а, b и c приходят из другого модуля (т. е. их содержимому доверять нельзя).

                              Даже допустим, что c — точно число и не ноль.
                              Ответить
                              • А вот с этим нам поможет одна очень полезная библиотека: https://www.npmjs.com/package/is-number !
                                Ответить
                                • Полезно. Нужно аргументы всех плюсиков обложить этой функцией, чтобы случайно конкатенация вместо сложения не сработала.
                                  Ответить
                                • Is bukva
                                  Ответить
                        • Согласен, коллега!
                          Ответить
                    • > PHP is a dynamically typed languag

                      "Вывод типов" при динамической типизации не нужен, т.к. в динамически питузированных языках есть ровно один тип*. Соответственно, PHP ничего там не выводит.

                      * С точки зрения компилятора и рантайма, а не с точки зрения фантазий программиста
                      Ответить
                      • Тип переменной один, да. Но типов значений в рантайме PHP много. Узнать тип значения можно с помощью функций is_array, is_int, is_float, is_string, is_bool, is_object и т. п. Это не фантазии.

                        Это в bash и в TCL всё — строка.
                        Ответить
                        • В PHP есть один единственный тип:

                          data Top = Int_ Int
                                   | Float_ Float
                                   | String_ String
                              deriving (Show)
                          
                          plus (Int_ a) (Int_ b) = Int_ (a + b)
                          plus _ _ = error "Именно поэтому я за PHP"


                          То, что некоторые операции могут в рантайме кидать исключение, если пытаться сложить арбузы с килограммами, это просто runtime exception. Никакой системой типов здесь и не пахнет.
                          Система типов, по определению — это механизм, который в compile time запрещает код, приводящий к таким исключениям.
                          Вывод типов — это дополнительный механизм в компиляторе, который позволяет опускать аннотации.
                          Ответить
                          • ..."Int_ 42" — это не "значение типа Int", а значение типа Top. В динамических языках все значения имеют этот тип. Поэтому "ошибка типизации" в них — это некорректный термин. Такие ошибки ничем принципиально не отличаются от ошибки деления инта на ноль.
                            Ответить
                            • P.P.S. То, что в моём коде выше есть тип Int — это внутренние особенности пелементации "интерпретатора" на ``Haskell''. Если бы интерпретатор был написан на asm, там бы внутре тоже никаких типов не было.
                              Ответить
                          • Всё так.
                            Ответить
                          • > Система типов, по определению — это механизм, который в compile time запрещает код, приводящий к таким исключениям.

                            Какое-то хуевое определение. Можно сделать компилируемый язык программирования с типами, который нихуя в compile time не запрещает на основании типов, а при попытке посчитать синус из строки, программа может упасть или начать какую-то хуйню делать (например, начать удалять случайные файлы на диске). Наличие типов не обязывает их тайпчекать, да и сами типы могут быть нужны не только чтоб не компилировать что-то, что эти типы нарушает
                            Ответить
                            • Кроме того, если некая переменная объявлена в Си как _Atomic, это делается не с целью чтоб нечто проверить на этапе компиляции и запретить что-то компилировать, а чтобы этот многопоточный код корректно работал.
                              Ответить
                            • > Какое-то хуевое определение

                              Такое определение даёт TAPL. Если в точности: "A type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute."

                              > компилируемый язык программирования с типами, который нихуя в compile time не запрещает на основании типов

                              Вообще ничего не запрещает? Тогда это язык без системы типов.
                              Ответить
                              • > Такое определение даёт TAPL. Если в точности: "A type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute."

                                Значит там плохое определение. Спецификатор _Atomic не "proving the absence of certain program behaviors", он наоборот описывает особенности поведения, которые нужны для этой переменной.

                                > Вообще ничего не запрещает? Тогда это язык без системы типов.

                                Не согласен. Я вполне могу представить язык (особо ебнутый диалект сишки), в котором есть типы, и в котором можно написать хуйню вида
                                char *a = "Hello world";
                                double b = sin(a);

                                и это успешно скомпилируется, но при запуске крашнется или посчитает какую-нибудь хуйню (например скастует адрес строки "Hello world" в double и посчитает синус из него). Типы при этом там будут
                                Ответить
                                • В момент компиляции там типов не будет, иначе вторая строчка не скомпилится.

                                  В рантайме могут быть, конечно. Это от компилятора зависит.

                                  Мне кажется, что тип определяет множество операций над объектом.

                                  Вот есть "указатель на чар".
                                  Есть у него операция "взять синус"?

                                  Ну если есть, то значит всё в порядке.

                                  Если нет, то проверка типов должна его отстрелить.
                                  Ответить
                                  • > В момент компиляции там типов не будет, иначе вторая строчка не скомпилится.

                                    Может в моем особо ебнутом диалекте сишке с особо слабой типизацией как раз всё скомпилируется. На каждый случай всегда будет существовать некий упоротый алгоритм неявного приведения типа одного говна в другое. Например, если функция принимает структуру str1 по значению, а ей пихают вместо структуры переменную типа double, оно будет байтики этого дабла интерпретировать как структуру, т.е. как если б кто-то объявил такую структуру, в него memcpy-нул этот дабл и передал в функцию.

                                    > Мне кажется, что тип определяет множество операций над объектом.

                                    Какие операции определяет спецификатор _Atomic в Си?
                                    Ответить
                                    • > как раз всё скомпилируется.

                                      Если система типов не отловила невилидную операцию, значит это дырка в системе типов.

                                      >оно будет байтики этого дабла интерпретировать как структур

                                      Это не скомпилируется.
                                      Если скомпилируется -- ты отключил систему типов.

                                      >_Atomic

                                      Операции изменения и чтения объекта из разных тредов без локов.

                                      Си это не проверяет (в этом месте система типов си соснула).

                                      В расте, например, это говно проверяется.
                                      Ответить
                                      • > Если система типов не отловила невилидную операцию, значит это дырка в системе типов.

                                        Может у меня в особом говнодиалекте Си все эти операции валидные. В любой непонятной ситуации делается reinterpret_cast, притом если размеры не соответствуют, то или там байтики обрежутся, или будет какой-то мусор в конце

                                        > Если скомпилируется -- ты отключил систему типов.

                                        Слабая типизация это не "ты отключил систему типов".

                                        > Операции изменения и чтения объекта из разных тредов без локов.

                                        Есть или нет там локи - implementation defined и зависит от хуйни, которую ты делаешь _Atomic. Если ты например атомарно хочешь поменять значение большой структуры, тебе без локов не обойтись

                                        https://stackoverflow.com/a/57687787

                                        > If your structure does not fit into a wide register, platforms usually implement these atomic types by using some kind of lock that is stored outside of your structure. If it does, they use the native capacities of the platform. Such properties may depend on your compiler options, in particular you'd have to ensure that these are the same for all your compiled objects.
                                        Ответить
                                        • &gt;Может у меня в особом говнодиалекте Си все эти операции валидные.


                                          Валидно брать синус от адреса структуры?

                                          ну ок, значит никаких проблем нет. Система типов допустила валидную операцию.

                                          &gt;Слабая типизация это не "ты отключил систему типов".


                                          Слабая типизация позволяет неявно превращать один тип в другой ради уменьшения бойлерплейта.

                                          Это и есть отключение типизации в какой-то момент.

                                          &gt;Есть или нет там локи - implementation defined

                                          Я имел ввиду лок снаружи.

                                          Я, как пользователь объекта, могу вызвать на нем операцию без явной синхронизации.

                                          Под капотом конечно может быть что угодно.

                                          На каких-то платформамх там может быть префикс LOCK у инструкции (если одной инструкции хватит)

                                          На других -- отключение прерырваний (если у тебя одно ядро, то вероятно хватит).

                                          На третьих нет вообще нихуя, и нужно чуть-ли не спинлоки городить (если это там драйвер какой-нить )

                                          Алсо, некоторые инсвтрукции атомарны сами по себе

                                          Это всё правда детали реализации.
                                          Ответить
                                          • > Это и есть отключение типизации в какой-то момент.

                                            Нет. Нет типизации например в языке brainfuck. А когда на каждый случай есть ебнутое правило приведения типа, это "типизация есть, но есть ебнутые правила неявного приведения типов, которые всегда к какому-то типу что-то скастуют"
                                            Ответить
                                            • Если даже типы как попало кастуются таким уебанским образом, у них могут быть некие свойства, которые при этом учитываются. Например, если в некую функцию передать char вместо некоей структуры по значению, можно предположить, что фукнция получит кусок памяти, где сначала будет этот один байт, а дальше там будет какой-то случайный мусор. Т.е. в какой-то мере тип что-то определяет!
                                              Ответить
                                              • Я согласшусь со Снаутом.

                                                "типом' ты называешь подсказку комплиятора.


                                                В таком случае, ключевое слово `register` и вот такая хйня являются типами

                                                #define likely(x)       __builtin_expect(!!(x), 1)
                                                #define unlikely(x)     __builtin_expect(!!(x), 0)



                                                Существует два использования типов.


                                                Типы-по-Снауту: какая-то хуйня для проверки корректности кода (ламерски выражась).

                                                Типы-по-j123: какая-то хуйня, помогающая компилятору генерить более правильный (иногда просто корректный, или более оптимальный) код.

                                                У нас в тайпсрипте есть только первые типы, например.
                                                Ответить
                                                • > Типы-по-Снауту: какая-то хуйня для проверки корректности кода (ламерски выражась).

                                                  > Типы-по-j123: какая-то хуйня, помогающая компилятору генерить более правильный (иногда просто корректный, или более оптимальный) код.

                                                  Второе не исключает первое. Т.е. типы и для проверки какого-то неправильного поведения (когда в какую-то функцию передал не ту хуйню и компилятор насрал варнингами или вообще ошибку выдал) подходят.

                                                  > У нас в тайпсрипте есть только первые типы, например.

                                                  В TS точно доступны Uint8Array Uint16Array т.к. тупоскрипт это тупо надстройка над жабаскриптом. И если ты выбираешь между таким или таким массивом, ты наверное руководствуешься не тем, чтобы корректность кода проверять, а чтобы байтики экономить (или не экономить, если в 8 бит значения не влазят)
                                                  Ответить
                                            • Вот да, например, в Ассемблере нету типизации. Там тип присутствует в самой операции: хочешь, умножай два операнда как знаковые, хочешь — как беззнаковые. Процессор сам не умеет приводить типы.

                                              А если типы неявно приводятся (как в Бейсике, например, округляется плавающий питух при копировании в целочисленную переменную), то типизация есть, но слабая.
                                              Ответить
                                              • Насчет ассемлера еще можно в теории доебаться, например нельзя сделать mov ax, rbx т.к. размеры регистров разные, и размеры регистров можно считать как бы типом, но это довольно спорная доебка. Можно сказать, что на самом-то деле нет там никаких типов, это просто таких говноинструкций не завезли, чтобы такую хуйню делать
                                                Ответить
                                                • Да, по сравнению с PDP-11, в котором можно было выполнить операции над любыми парами регистров, в x86 операций не хватает: некоторые операции вообще возможны только в первым аккумулятором (RAX/EAX/AX) или со «счётчиком» (RCX/ECX/CX). Тут «протечка абстракции».
                                                  Ответить
                                              • Ну вообще в асемблере тип это размер.

                                                Обычно чем выше язык, тем более семантичные в нем операции

                                                в Python нельзя использовать длину хуя как адрес в памяти, в сишке можно но нужно кастануть, а в асемблере вообще норм.
                                                Ответить
                                • > и это успешно скомпилируется

                                  -Wall -Werror делает из скриптусишки что-то удобоваримое
                                  Ответить
                                • Пока спор довольно бессмысленный, т.к. мы не сошлись с определениями. Ты определяешь типы как ``вот такая-то хуй-ня называется типом в сишке''. Я определяю типы по TAPL.

                                  ``Типы'' в сишке без условного -Werror -Wall просто позволяют компилятору примерно почувствовать размер данных на стеке, знать, влезет ли переменная в регистр, какие инструкции нужно эмитить или можно опускать, и т.д. С точки зрения TAPL — это не система типизации, а какие-то аннотации для котогенератора.
                                  Ответить
                                  • Человек это хуйня с плоскими ногтями, да
                                    Ответить
                                • Чисто теоретически можно представить и рахитектуру где память плавпитухом адресуется, тогда и в синусе от указателя можно будет смысл придумать...
                                  Ответить
                                  • Память с радиально-круговой адресацией, указатель на которую задаётся парой (R, phi), где R — радиус, phi — угол.

                                    Тогда, например, указатель будет соответствовать строке двухмерного массива номер R*cos(phi) и столбцу номер R*sin(phi).

                                    Можно ещё придумать память с трёхмерной адресацией: с цилиндрической (добавится высота) или со сферической (добавится второй угол).
                                    Ответить
                                    • Я подумал, а ведь жёсткие диски в C-H-S фактически реализовывали цилиндрическую систему координат. Только до меня никто не додумался переводить её в прямоугольную и считать синус от номера сектора.
                                      Ответить
                                  • Память адресуется плавпитухом, и бит там тоже не дискретный
                                    Ответить
                                    • Недискретный бит — это уже не бит, а какой-то недискрит
                                      Ответить
                                    • Мне кажется все пукающие коты внутри прмиерно так и устроены
                                      Ответить
                          • > Система типов, по определению — это механизм, который в compile time запрещает код, приводящий к таким исключениям.

                            Являются ли проверяемые на стадии компиляции контракты (ассерты) системой типов?
                            Ответить
    • Почти OCaml... Только в нём писанины меньше.
      Ответить
    • Почему оно не уходит в рекурсию? Почему вызов typeof(test()) это не вызов?
      Ответить
      • Потому что typeof — это не функция, а конструкция языка, а чтобы посчитать тип, вызывать ничего не надо.

        If the type of the operand is a variably modified type, the operand is evaluated; otherwise, the operand is not evaluated.

        https://en.cppreference.com/w/c/language/typeof.html
        Ответить
        • Сразу захотелось узнать, что такое variably modified type. Оказывается, в сишке это VLA.
          Ответить
        • блядь, я думал семантически это макрос
          Ответить
          • Как ты макрос напишешь, тип возвращающий?
            Ответить
            • я засмеялся: как же я макрос напишу, когда ты их всех
              Ответить
    • Ура! Теперь можно лекго и не задумываясь писать указатели на указатели на функции принимающие указатели на функции возвращающие указатели на указатели на функции возвращающие указатели на функции принимающие указатели на функции...
      Ответить
      • Теперь можно писать нечитаемый код
        Ответить
        • Наконец-то!

          Я придумал, надо организовать соревнования: кто напишет самый непонятный кот. Назову его "IOCCC".

          Как тебе идея?
          Ответить
    • Сорок лет назад auto в си значило совсем иное
      Ответить
      • > Сорок лет
        https://www.youtube.com/watch?v=58Eff70zgjQ
        Ответить
        • Они ушли
          Чеченская Гитара•3,7 млн просмотров

          10 признаков того, что ВЫ ОДНОВРЕМЕННО думаете друг о друге Карл Юнг
          Юнгианка
          Новинка
          1,8 тыс. просмотров
          Ответить
        • я не шучу, кстати

          в древней сишке надо было указывать: лежит переменная на стеке (тн "автоматическая") или в регистре. И там `auto` означала "автоматическая".

          Потом это стало поведением по умолчанию, и это слово убрали.
          Ответить
          • E6amb TbI . SMALL!
            Ответить
          • Ты ещё рааскажи как int перед именем необязательно было писать.

            Или как строки были нультерминаторами... Ой, а это до сих пор так
            Ответить
            • Вообще смешно: в сишке отказались от bounds checking, потому что это «снижает пирфоманс», но при этом в стандартной библиотеке строки, у которых длина каждый раз считается за O(n), да ещё не binary-safe.
              Ответить
              • строки в сишке не intended to be used by highly performance code, volgens mij. Они чиста чтобы логами там сирануть, такое всякое
                Ответить
                • Да, это костыль, нахуяченный по-быстрому, но куча ПО их стала использовать как единственную реализацию строк. Они повсюду, даже в интерфейсы ОС проникли.
                  Ответить
                  • Вот вроде есть у тебя стандартные говнофнукции для строк, а один хуй приходится свио городить. Хочешь файл открыть, скопируй часть строки и насри ебаным нуликом в конце.

                    Зато Ричи, молодец, заранее продумал, чем заниматься стандартизаторам: теперь каждый год они с друзьями собираются, надевают носочки и придумывают новую "безопасную" foo_s нкцию
                    Ответить
                    • А ещё есть asprintf и vasprintf, которые являются гнутыми расширениями и присутствуют только в библиотеке Линукса и BSD, а в стандарте их нету.
                      Ответить
                      • у винды ееще есть свои функции безопасные
                        у потсфикса есть
                        Ответить
                        • И начинается, либо свои костыли, либо свои костыли обмазанные кучей ifdef
                          Ответить
                        • Да, вообще смешно:

                          Сначала придумали strcat. Потом сказали, что небезопасно: функция может распидорасить оперативку, если ты не угадал нужный размер буфера.

                          Потом сказали: вот вам strncat — более безопасный вариант.

                          Потом сказали: нет, мы ошиблись, держите ещё более безопасный вариант — strncat_s.

                          А параллельно в MS решили навернуть свои безопасные варианты.

                          Ладно, размер буфера для strcat я могу предугадать, просто сложив размеры строк (ага, лишние вызовы с O(n)). Но как я угадаю размер, который потребует sprintf? Мне по сути для подсчёта длины нужно повторить алгоритм sprintf, но спекулятивно, без реального заполнения строки, а потом уже вызывать sprintf. Хорошо, что в asprintf это решили.

                          К слову, я ещё видел какие-то «безопасные» библиотеки для строк, только там не «n» и не «_s», а какие-то другие префиксы/инфиксы/суффиксы.
                          Ответить
                          • real_strcat

                            и ещё эта блядская любовь сишников к сокращениям до нечитаемости
                            Ответить
                            • В одном мире придумали sbrk, а в другом мире придумали AccessCheckByTypeResultListAndAuditAlarm ByHandle.
                              Ответить
                              • O_CREAT

                                &gt;sbrk
                                Prd krt skrz drn, zprv zhlt hrst zrn

                                кстати, он устарел же. mmap
                                Ответить
                                • Глибцшный аллокатор выбирает в зависимости от размера слайса
                                  Ответить
                                • ptnpdr
                                  Ответить
                                  • У нас есть ещё более безопасный вариант этой функции: ptnpdr_s.
                                    Ответить
        • Сорок лет, жизнь пошла за второй перевал.
          Ответить
    • Совет: Любую дискуссию с оппонентом начинайте словами: "Ой, ну не сочиняй", "Ой, ну не выдумывай, выдумщик" и "Ну и бред!".
      Ответить
    • сука это очень смешно
      https://pbs.twimg.com/media/GvPhqMNWAAAIt16?format=jpg&name=large
      Ответить
      • десктоп не переходи!!!
        Ответить
        • Файк, переходи!
          Это же твой любимый персонаж. Крупный предприниматель, серьезный блоггер, опытный программист, и видный либертарианец.

          И кстати: нет такого языка "дот нет"
          Ответить
          • Да я уже в видел, когда он слёзно признался, что действительно наебывает всех вокруг с деньгами. Собственно, это продолжение его стенаний.
            Ответить
      • https://pikabu.ru/story/_12916539

        может показаться, что это политизированный пост, но мы-то знаем, кого действительно обыгрывает эта ирония
        Ответить
        • Раздражает, когда путают термины «занять» и «одолжить».

          Занять — это отнять (на время).
          Одолжить — сделать кого-то своим должником.

          Лучше бы писали «дать в долг» и «взять в долг», если путают.
          Ответить
    • всё
      https://pbs.twimg.com/media/Gu5O5CyWkAAPNRy?format=jpg&name=small
      Ответить
      • Девушка рассказала, что отец случайно запёк её хомяка в духовке, и сообщил ей об этом с помощью ИИ-видео, где уже мёртвый хомяк объясняет, что папа не хотел его убивать.
        Ответить
    • Долбаный пидорас, рассекающий сегодня по озеру Смолино на своем ебучем белом катере, обращаюсь к тебе. Т
      Ответить

    Добавить комментарий