С Новым годом! Форум программистов, компьютерный форум, киберфорум
steelcraft
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Ошибка №1. Типизация в языке C

Запись от steelcraft размещена 18.06.2024 в 16:37
Показов 1738 Комментарии 17

Языки программирования множатся и развиваются. Мало кому удается изучить в студенчестве один язык и дотянуть с ним до пенсии (хотя, возможно, программисты на COBOL поспорят со мной). Большинству приходится время от времени изучать новый язык.

Конечно, это требует времени. С опытом, конечно, дело идет быстрее; однако для достижения профессионального уровня все равно потребуется какое-то время. При этом хотелось бы максимально быстро получить хотя бы общее впечатление о языке: что он может, для каких областей подходит идеально, а для каких не очень, насколько выразителен будет код на нем и так далее.

Для меня одной из важнейших характеристик языка является его типизация. Она накладывает отпечаток на многие, если не все, его свойства.

По этой причине на собеседовании по C один из первых моих вопросов: какая типизация используется в языке? Ответ определяет дальнейший ход беседы.

Если в ответ вижу недоуменный взгляд, передо мной начинающий (я не имею в виду календарный стаж, он может быть хоть 50 лет).

Часто слышу ответ: "сильная типизация". Чуть лучше, кандидат начинает думать, хоть и ошибается. Спрашиваю: "почему?". Типичный ответ: "потому что при объявлении каждого объекта явно указывается его тип". Увы, спутал статическую типизацию с сильной.

Что хочу услышать от кандидата.

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

Типизация может быть сильной или слабой. Языки с сильной типизацией при присваивании значения объекту требуют строгого соответствия типов. Языки со слабой типизацией допускают неявные преобразования типов (и не факт, что мнение компилятора на этот счет совпадет с вашими ожиданиями).

Например, язык Ruby имеет динамическую сильную типизацию. Язык C (как и его кузен C++) имеет статическую слабую типизацию.

Это не просто информация ради информации. Незнание этого факта неизбежно ведет к другим ошибкам.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 17
Комментарии
  1. Старый комментарий
    Аватар для alecss131
    Еще типизация бывает явная и неявная. В плюсах она можно сказать неявная (после введения auto), а в Си явная.
    Запись от alecss131 размещена 18.06.2024 в 23:05 alecss131 на форуме
  2. Старый комментарий
    Спасибо, упустил этот момент. Хотя, конечно, автору идеи добавить в язык auto (точнее, изменить смысл бесполезного и потому забытого ключевого слова) не мешало бы оторвать яйца.

    Нет, я, конечно, понимаю, что сделано это было сначала с благими намерениями, для использования в темплейтах, где автоматический вывод типа бывает весьма полезен. Беда в том, что ленивые задницы начали тыкать auto куда ни попадя, делая код нечитаемым. Подумаешь, при чтении нужно делать за компилятор его работу, зато печатать меньше. Если бы я хотел писать на питоне, я бы писал не питоне, незачем ради этого калечить годный язык.

    Слава богу, эта чума пока что миновала C.
    Запись от steelcraft размещена 19.06.2024 в 01:09 steelcraft вне форума
  3. Старый комментарий
    Неявная = динамическая?
    Запись от testuser2 размещена 19.06.2024 в 05:56 testuser2 вне форума
  4. Старый комментарий
    Нет, можно такие трюки и со статической делать (и делают, к сожалению). Просто тип объявляемого объекта определяется компилятором исходя из типа значения инициализации. И то же самое предстоит сделать читателю, поскольку слово auto никак ему в этом не помогает. Иногда это элементарно, иногда нет.
    Запись от steelcraft размещена 19.06.2024 в 10:54 steelcraft вне форума
  5. Старый комментарий
    Везде где есть "CopyMemory" наверное можно делать какие-нибудь трюки )
    Запись от testuser2 размещена 19.06.2024 в 11:36 testuser2 вне форума
  6. Старый комментарий
    Аватар для CoderHuligan
    Строго говоря, в динамически-типизированных языках, тип имеет само значение, а не ячейка памяти (размер ячейки), как в статически-типизированных языках. Вот почему, если язык типобезопасен (по Корделли), не имеет смысла вести речь о сильной или слабой типизации, так как эти обозначения слишком условны и расплывчаты. Как С, так и С++ обеспечивают типобезопасность во время исполнения, благодаря четкой спецификации возможных неявных преобразований типов, которые гарантируют, что значение не коррумпирует соседнюю ячейку памяти.
    Запись от CoderHuligan размещена 19.06.2024 в 14:54 CoderHuligan вне форума
  7. Старый комментарий
    Цитата Сообщение от CoderHuligan
    если язык типобезопасен (по Корделли), не имеет смысла вести речь о сильной или слабой типизации
    Даже в случае C имеет смысл вести речь о слабой типизации. Эта тема всплывает, в частности, когда речь заходит об арифметике указателей. Очень многие тонут в ней.
    Запись от steelcraft размещена 19.06.2024 в 21:51 steelcraft вне форума
  8. Старый комментарий
    Аватар для AlexProgramm
    Хм.. Вроде еще не сталкивался с динамической типизацией
    Динамическое выделение памяти - да, но чтобы тип переменной определялся при присваивании ей значения - вроде не сталкивался
    Запись от AlexProgramm размещена 23.06.2024 в 10:01 AlexProgramm вне форума
  9. Старый комментарий
    Цитата Сообщение от AlexProgramm
    Хм.. Вроде еще не сталкивался с динамической типизацией
    Динамическое выделение памяти - да, но чтобы тип переменной определялся при присваивании ей значения - вроде не сталкивался
    На самом деле таких языков очень много. Например, столь популярный сейчас Python, JavaScript, Ruby, легендарный Smalltalk... После длительного использования языков со статической типизацией писать на них довольно непривычно.

    Например, я поначалу упорно писал на Ruby в стиле C++, пока не попались на глаза несколько замечательных книг по идиомам этого языка. Оказалось, что писать на нем нужно совершенно по-другому. И дело сразу пошло на лад.
    Запись от steelcraft размещена 23.06.2024 в 13:52 steelcraft вне форума
  10. Старый комментарий
    Аватар для AlexProgramm
    А в java есть динамическая типизация?
    Запись от AlexProgramm размещена 23.06.2024 в 17:12 AlexProgramm вне форума
  11. Старый комментарий
    Цитата Сообщение от AlexProgramm
    А в java есть динамическая типизация?
    Нет, в Java типизация статическая: все объекты должны быть объявлены явно, и в объявлении должен быть указан тип объекта, который останется неизменным в течение всего времени жизни объекта.

    Фактически в первом приближении можно считать "продолжением" C++, из которого удалили большинство опасных элементов: указатели, множественное наследование и т.п. Поэтому типизация так и осталась статической. Правда, усилилась по сравнению с C++.
    Запись от steelcraft размещена 23.06.2024 в 19:03 steelcraft вне форума
  12. Старый комментарий
    Аватар для alecss131
    Цитата Сообщение от steelcraft
    все объекты должны быть объявлены явно
    Вот это неверно, начиная с языка версии 10 (а я почему-то думал что уже с 9, но не суть) ввели ключевое слово var , тем самым добавив неявную типизацию.

    Цитата Сообщение от steelcraft
    Правда, усилилась по сравнению с C++
    Это тоже спорно. Число плюс строка в С++ не вызовет ошибок, но на выходе будет мусор (надо использовать std::to_string для поведения как в джаве), зато джава просто добавит это число к строке в виде строки.

    Цитата Сообщение от steelcraft
    После длительного использования языков со статической типизацией писать на них довольно непривычно.
    Я изза этого дропнул питон, он совсем мне не зашел. Но тут уже 2 фактора сказываются, динамическая типизация и полностью неявная типизация. Зато вот язык с неявной типизацией вполне пришелся по душе.
    Цитата Сообщение от steelcraft
    Например, я поначалу упорно писал на Ruby в стиле C++, пока не попались на глаза несколько замечательных книг по идиомам этого языка. Оказалось, что писать на нем нужно совершенно по-другому. И дело сразу пошло на лад.
    Такое особенно чувствуется когда идиомы языка идут с привычками и некоторыми принципами. Например те же с++/джава и думаю многие другие языки где "хороший тон" скрывать все поля классов, а для доступных извне делать геттеры/сеттеры, но внезапно попадается язык где так делать не принято (и есть специальные наблюдатели свойств в которых можно ограничить допустимые значения).

    Еще бы я неявную/явную типизации разделил на полную/чистую и смешанную. Смешанная это когда можно делать и так и так или в одних случаях одно, в других другое. А полная где везде возможен один только тип.
    Для пояснения приведу примеры. Смешанная будет в тех же java/c++/swift, там переменные можно объявлять без указания типа, но в функциях (параметрах) надо указывать тип (ну и или дженерик/шаблон, не суть важно). А чистая неявная будет в python, там везде (хотя могу ошибаться, язык знаю очень поверхностно) можно не указывать тип, даже в параметрах функций.
    Запись от alecss131 размещена 23.06.2024 в 22:43 alecss131 на форуме
  13. Старый комментарий
    Цитата Сообщение от alecss131
    Вот это неверно, начиная с языка версии 10 (а я почему-то думал что уже с 9, но не суть) ввели ключевое слово var , тем самым добавив неявную типизацию.
    Точно, спасибо. Всегда забываю про лазейки auto/var/...

    Цитата Сообщение от alecss131
    могу ошибаться, язык знаю очень поверхностно
    Не ошибаетесь, так и есть. Поэтому после долгой привычки к языкам со статической типизацией при написании функций/методов наступает ступор: мне же через параметры могут передать вообще что угодно, и что мне с этим делать? Нужно привыкать к новым идиомам.
    Запись от steelcraft размещена 23.06.2024 в 23:30 steelcraft вне форума
  14. Старый комментарий
    Аватар для AlexProgramm
    steelcraft
    продолжением" C++, из которого удалили большинство опасных элементов: указатели, множественное наследование и т.п.
    А, убрали? А я где то читал, в книге по java, про множественное наследование, что в java это защищено интерфейсами, а в С++ не защищено и поэтому там присутствует так называемый "ромб смерти"
    Запись от AlexProgramm размещена 24.06.2024 в 09:25 AlexProgramm вне форума
  15. Старый комментарий
    Цитата Сообщение от AlexProgramm
    steelcraft
    А, убрали? А я где то читал, в книге по java, про множественное наследование, что в java это защищено интерфейсами, а в С++ не защищено и поэтому там присутствует так называемый "ромб смерти"
    Да, именно так. В С++ нет интерфейсов, их заменяет идиома в виде класса со всеми чисто виртуальными методами. Насчет Java, как, наверное, уже заметили, я не очень в теме (имею представление лишь потому, что в книгах по ООП она часто используется в примерах), а вот в том же C#, который довольно похож на нее, можно наследовать только от одного предка и любого количества интерфейсов. Поэтому ромбы исключаются (а вместе с ними и некоторые случаи, когда множественное наследование действительно полезно).
    Запись от steelcraft размещена 24.06.2024 в 10:20 steelcraft вне форума
  16. Старый комментарий
    Аватар для Fulcrum_013
    Цитата Сообщение от AlexProgramm
    steelcraft
    А, убрали? А я где то читал, в книге по java, про множественное наследование, что в java это защищено интерфейсами, а в С++ не защищено и поэтому там присутствует так называемый "ромб смерти"
    В С++ есть виртуальное наследование котрое делает оный ромб очегь даже удобным инструментом. Хотя это опять же из серии С с классами. При помощи С++ (использвования шаблонов) есть более удобные и более производительные способы решения проблемы слабого базового класса чем множественное наследование, а тем более виртуальное множественное наследование.
    Запись от Fulcrum_013 размещена 30.06.2024 в 14:55 Fulcrum_013 вне форума
  17. Старый комментарий
    Аватар для Fulcrum_013
    Цитата Сообщение от alecss131
    Еще типизация бывает явная и неявная. В плюсах она можно сказать неявная (после введения auto), а в Си явная.
    В плюсах она вообще то настрааиваемая пользователем. Неявная она только для фундаментальных типов. А для пользовательских типов как операторы приведения задашь - явными или неявными так и будет, а по умолчанию вообще строгая.
    Запись от Fulcrum_013 размещена 30.06.2024 в 14:59 Fulcrum_013 вне форума
 
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru