Обычно в 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
точности , Поскольку округление происходит в разных местах, результат может зависеть. Это всего лишь один пример для типов переменных, влияющих на поведение другой идентичной программы.