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 Xjest 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, Xnie jest zmienną, ale stałą, więc jest dosłownie zamieniony na preprocesor, 5.2gdziekolwiek wspomniano X. Nie możesz ponownie przypisać X.
autofaktycznie 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.2jest adouble, więc pierwszy program zaokrągla podwójne literały dofloatprecyzji, następnie dodaje je jako liczby zmiennoprzecinkowe, podczas gdy drugi zaokrągla podwójną reprezentację 5.1 z powrotemdoublei dodaje ją dodoublewartości 5.2 za pomocądoubledodawania, a następnie zaokrągla wynik tego obliczenia dofloatprecyzji . 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.