- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#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
а мржно пейсать auto auto(auto auto)?
Ведь если какой-то петух напишет допустим
то кто-то может вызвать такую говнофункцию с типом "int" а кто-то с типом "double" и это будет две разные функции, а прототип всего один. Короче хуйня какая-то. В Си нет такого, чтоб было несколько функций с одним именем
И возвращать auto она тоже не может т.к. из прототипа нихуя не ясно, какую хуйню она там может возвращать, и тогда если у нас объявлен лишь прототип
Компилятору нихуя не будет ясно, какое говно оно вернет. Это тебе даже крестопараша не скомпилирует.
Увы, можно использовать только в макросах. В функциях нельзя из-за отсутствия перегрузки.
«PHP» выводит типы, но во-первых, снаружи ничего не видно (неявность), во-вторых он тут же приведёт тип к другому, если можно (слабость).
«Если можно» — это ещё не слабость. Приводить «float» в «double» может и строгий язык, например.
Слабость возникает, когда язык позволяет неявно приводить типы с потерей информации — например, массив в строку, — либо с возможными ошибками.
Но в целом, это довольно размытые термины без точных границ, поэтому и хрен с ними.
опять плюнул, опять сказал "эх" и ушел. И Бог с ним. Расскажу лучше про Илью
Павловича.
Предлагаю ввести термин "ебанутая типизация". Например, когда ты можешь унсигнеду присвоить сигнед, или пойнтеры разных типов присваивать — это слабая; а когда петух складывает строку с числом, а потом делит на число и у него ничего не падает — это ебанутая
> 'петух'+42
'петух42'
> ('петух'+42)/3
NaN
Ничего не упало, никаких исключений не выкинуло.
Кто говорил, что в PHP нету типов?
P.S. А если заменить плюс на точку (конкатенацию), то отрабатывает, переводит число в строку: ('петух' . 42) возвращает 'петух42'.
Но вот разделить строку на число не может, снова TypeError.
Даже допустим, что c — точно число и не ноль.
"Вывод типов" при динамической типизации не нужен, т.к. в динамически питузированных языках есть ровно один тип*. Соответственно, PHP ничего там не выводит.
* С точки зрения компилятора и рантайма, а не с точки зрения фантазий программиста
Это в bash и в TCL всё — строка.
То, что некоторые операции могут в рантайме кидать исключение, если пытаться сложить арбузы с килограммами, это просто runtime exception. Никакой системой типов здесь и не пахнет.
Система типов, по определению — это механизм, который в compile time запрещает код, приводящий к таким исключениям.
Вывод типов — это дополнительный механизм в компиляторе, который позволяет опускать аннотации.
Какое-то хуевое определение. Можно сделать компилируемый язык программирования с типами, который нихуя в compile time не запрещает на основании типов, а при попытке посчитать синус из строки, программа может упасть или начать какую-то хуйню делать (например, начать удалять случайные файлы на диске). Наличие типов не обязывает их тайпчекать, да и сами типы могут быть нужны не только чтоб не компилировать что-то, что эти типы нарушает
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
Я придумал, надо организовать соревнования: кто напишет самый непонятный кот. Назову его "IOCCC".
Как тебе идея?
https://www.youtube.com/watch?v=58Eff70zgjQ
Чеченская Гитара•3,7 млн просмотров
10 признаков того, что ВЫ ОДНОВРЕМЕННО думаете друг о друге Карл Юнг
Юнгианка
Новинка
1,8 тыс. просмотров
в древней сишке надо было указывать: лежит переменная на стеке (тн "автоматическая") или в регистре. И там `auto` означала "автоматическая".
Потом это стало поведением по умолчанию, и это слово убрали.
Или как строки были нультерминаторами... Ой, а это до сих пор так