Обычно в C мы должны сообщать компьютеру тип данных в объявлении переменной. Например, в следующей программе я хочу вывести сумму двух чисел с плавающей запятой X и Y.
#include<stdio.h>
main()
{
float X=5.2;
float Y=5.1;
float Z;
Z=Y+X;
printf("%f",Z);
}
Мне пришлось сообщить компилятору тип переменной X.
- Разве компилятор не может определить тип
Xсамостоятельно?
Да, может, если я сделаю это:
#define X 5.2
Теперь я могу написать свою программу, не сообщая компилятору тип X:
#include<stdio.h>
#define X 5.2
main()
{
float Y=5.1;
float Z;
Z=Y+X;
printf("%f",Z);
}
Итак, мы видим, что язык Си имеет какую-то особенность, используя которую он может самостоятельно определять тип данных. В моем случае было установлено, что Xэто тип float.
- Почему мы должны упоминать тип данных, когда мы объявляем что-то в main ()? Почему компилятор не может определить тип данных переменной самостоятельно,
main()как это делается в#define.
#define X 5.2, Xэто не переменная, а константа, поэтому она буквально заменяется препроцессором на 5.2то, что вы упомянули X. Вы не можете переназначить X.
autoфактически делает то, что вы хотите). С другой стороны, если вы думаете, что знаете, что делает ваш код, и вы действительно ввели что-то еще, статическая типизация, подобная этой, обнаружит ошибку раньше, прежде чем станет огромной проблемой. Каждый язык соблюдает баланс: статическая типизация, определение типа, динамическая типизация. Для некоторых задач дополнительная печать действительно стоит того. Для других это пустая трата времени.
5.2это adouble, поэтому первая программа округляет двойные литералы доfloatточности, затем добавляет их как числа с плавающей точкой, в то время как вторая округляет двойное представление 5.1 доdoubleи добавляет его кdoubleзначению 5.2, используяdoubleсложение, затем округляет результат этого вычисления доfloatточности , Поскольку округление происходит в разных местах, результат может зависеть. Это всего лишь один пример для типов переменных, влияющих на поведение другой идентичной программы.