Zwykle w C musimy podać komputerowi rodzaj danych w deklaracji zmiennej. Np. W poniższym programie chcę wydrukować sumę dwóch liczb zmiennoprzecinkowych X i Y.
#include<stdio.h>
main()
{
float X=5.2;
float Y=5.1;
float Z;
Z=Y+X;
printf("%f",Z);
}
Musiałem poinformować kompilator o typie zmiennej X.
- Czy kompilator nie może sam określić typu
X
?
Tak, może to zrobić, jeśli to zrobię:
#define X 5.2
Mogę teraz napisać mój program bez informowania kompilatora o typie X
:
#include<stdio.h>
#define X 5.2
main()
{
float Y=5.1;
float Z;
Z=Y+X;
printf("%f",Z);
}
Widzimy więc, że język C ma jakąś funkcję, za pomocą której może samodzielnie określać rodzaj danych. W moim przypadku ustalono, że X
jest typu float.
- Dlaczego musimy wspomnieć o rodzaju danych, kiedy deklarujemy coś w main ()? Dlaczego kompilator nie może samodzielnie określić typu danych zmiennej
main()
tak jak w#define
.
#define X 5.2
, X
nie jest zmienną, ale stałą, więc jest dosłownie zamieniony na preprocesor, 5.2
gdziekolwiek wspomniano X
. Nie możesz ponownie przypisać X
.
auto
faktycznie robi to, co chcesz). Z drugiej strony, jeśli uważasz, że wiesz, co robi Twój kod i faktycznie wpisałeś coś innego, wpisywanie statyczne w ten sposób wcześniej wykryje błąd, zanim stanie się on ogromnym problemem. Każdy język zachowuje równowagę: pisanie statyczne, wnioskowanie typu, pisanie dynamiczne. W przypadku niektórych zadań dodatkowe pisanie jest naprawdę tego warte. Dla innych to marnotrawstwo.
5.2
jest adouble
, więc pierwszy program zaokrągla podwójne literały dofloat
precyzji, następnie dodaje je jako liczby zmiennoprzecinkowe, podczas gdy drugi zaokrągla podwójną reprezentację 5.1 z powrotemdouble
i dodaje ją dodouble
wartości 5.2 za pomocądouble
dodawania, a następnie zaokrągla wynik tego obliczenia dofloat
precyzji . Ponieważ zaokrąglanie występuje w różnych miejscach, wynik może być inny. To tylko jeden przykład rodzajów zmiennych wpływających na zachowanie innego identycznego programu.