В литературе об этом не говорится. Я думаю, что строгая типизация - это не да / нет, есть разные степени строгой типизации.
В языке программирования есть спецификация того, как он выполняет программы. Иногда непонятно, как выполнять определенные программы. Например, программы, которые пытаются вычесть строку из числа. Или программы, которые делят на ноль. Есть несколько способов справиться с этими состояниями. В некоторых языках есть правила работы с этими ошибками (например, они вызывают исключение). В других языках просто нет правил для таких ситуаций. Эти языки обычно имеют системы типов для предотвращения компиляции программ, которые приводят к неопределенному поведению. И также существуют языки, которые имеют неопределенное поведение и не имеют системы типов, чтобы предотвратить эти ошибки во время компиляции (если вы напишете программу, которая выполняет неопределенное поведение, она может запустить ракеты).
Так:
Языки, которые определяют, что происходит во время выполнения в каждом случае (например, добавление числа в строку), называются динамически типизированными. Языки, которые предотвращают выполнение программ с ошибками во время компиляции, имеют статическую типизацию. Языки, которые не определяют, что происходит, а также не имеют системы типов для предотвращения ошибок, называются слабо типизированными.
Так является ли Java статически типизированной? Да, потому что его система типов не позволяет вычитать строку из числа. Нет, потому что это позволяет делить на ноль. Вы можете предотвратить деление на ноль во время компиляции с помощью системы типов. Например, создав числовой тип, который не может быть нулем (например, NonZeroInt), и разрешить деление только на числа, которые имеют этот тип.
Итак, C строго типизирован или слабо типизирован? C строго типизирован, потому что система типов запрещает некоторые ошибки типов. Но он слабо типизирован в других случаях, когда неясно, что происходит (и система типов вас не защищает).