Зазвичай в 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()
як це робиться в#define
.
#define X 5.2
, X
це не змінна, а константа, тому вона буквально замінюється бути препроцесором з 5.2
будь-якого місця, про яке ви згадали X
. Ви не можете перепризначити X
.
auto
насправді робить те, що ви хочете). З іншого боку, якщо ви думаєте, що знаєте, що робить ваш код, і ви насправді набрали щось інше, статичне введення тексту подібне до цього виявить помилку раніше, перш ніж це стане величезною проблемою. Кожна мова виявляє рівновагу: статичне введення тексту, інформування типів, динамічне введення тексту. Для деяких завдань додаткове набір тексту насправді того вартий. Для інших це марно.
5.2
є adouble
, тому перша програмаfloat
точно округляє подвійні літерали , потім додає їх як плавні, тоді як друга округляє подвійне представлення 5.1 назадdouble
і додає його доdouble
значення 5.2 за допомогоюdouble
додавання, потім округляє результат цього обчислення доfloat
точності . Оскільки округлення відбувається в різних місцях, результат може відрізнятися. Це лише один приклад для типів змінних, що впливають на поведінку інакше ідентичної програми.