Zrozumienie typów danych, rzutowania i struktur w C

4

C ściśle kontroluje, co jest przechowywane w pamięci. Nie ma pojęcia. Musisz dokładnie wskazać, jakie dane przechowujesz. To nie tylko bycie wybrednym. Ma to wpływ na sposób działania programu, ilość zużywanej przez niego pamięci oraz na to, czy obliczenia są prawidłowe, czy też pozbawione znaczenia.

Standardowe typy zmiennych

W C istnieją trzy standardowe typy zmiennych.

Liczba całkowita: int
Jest to 4-bajtowa liczba całkowita. Działa z liczbami całkowitymi.

Liczba zmiennoprzecinkowa: float
Jest to 4-bajtowa liczba zmiennoprzecinkowa. Działa z ułamkami dziesiętnymi.

Znak: znak
Jest to pojedynczy znak o długości 1 bajtu. Na przykład „a” lub „3”. Ciąg znaków w C to po prostu tablica takich znaków.

Następnie istnieją typy pochodne. Stosuje się je, gdy trzy standardowe typy nie wystarczą.

  • double : 8-bajtowa liczba zmiennoprzecinkowa. Większa dokładność.
  • short : 2-bajtowa liczba całkowita. Mniej pamięci, mniejszy zakres wartości.
  • unsigned short lub unsigned int : Te typy działają tylko z dodatnimi liczbami całkowitymi. Brak bitu znaku. Jeśli chcesz śledzić liczbę populacji lub wielkość partii, często jest to właściwy wybór.

Operatory i pierwszeństwo operatorów

Operatory w C wyglądają znajomo.

  • Dodatek +
  • - odejmowanie
  • / dzielenie
  • * mnożenie
  • % reszta z dzielenia

Ale bądź ostrożny z podziałem. Operator / wykonuje dzielenie całkowite, jeśli oba operandy są liczbami całkowitymi. W przeciwnym razie wykonywane jest dzielenie zmiennoprzecinkowe.

Spójrz na ten kod:

Wyprowadza wartość zmiennoprzecinkową, ponieważ a jest zadeklarowane jako typ float. Ale wartość „a” będzie wynosić 3,0. Dlaczego? Ponieważ kod najpierw wykonał dzielenie liczb całkowitych. 10 podzielone przez 3 daje 3. Wynik to 3. To 3 jest następnie konwertowane na 3,0, gdy jest przechowywane w „a”. Precyzja została utracona, zanim wartość w ogóle weszła do zmiennej.

Pierwszeństwo operatora w C jest zgodne ze standardowymi zasadami. Mnożenie i dzielenie wykonuje się przed dodawaniem i odejmowaniem.

Wynikiem wyrażenia 5+3*4 jest 17. Nie 32. Operator * ma wyższy priorytet niż +. Można to zastąpić nawiasami. „(5+3)*4” równa się 32. Najpierw obliczane jest „5+3”.

Priorytet staje się później mylący. Kiedy pojawiają się wskaźniki, sytuacja się komplikuje. Ale na razie pamiętaj: mnóż i dziel przed dodawaniem i odejmowaniem.

Typowanie

C umożliwia konwersję typów w locie. Często robi się to za pomocą wskaźników. Dzieje się to również automatycznie po przypisaniu do określonych typów.

W powyższym przykładzie wynik będący liczbą całkowitą „10/3” został automatycznie przekonwertowany na liczbę zmiennoprzecinkową. Ale co, jeśli potrzebujesz części ułamkowej?

Rzutowanie typów odbywa się poprzez umieszczenie nazwy typu w nawiasie przed wartością.

Zamień a=10/3; na a=(float)10/3;.

Teraz „a” jest równe 3,33333. Liczba 10 jest konwertowana na liczbę zmiennoprzecinkową przed podziałem. Dzielenie ma miejsce w kontekście liczb zmiennoprzecinkowych. Wynik zachowuje miejsca dziesiętne.

wpisano def

Możesz zadeklarować nazwane typy zdefiniowane przez użytkownika w C za pomocą operatora typedef. Jest to powszechne w kodzie C.

Pozwala to na deklarowanie typów logicznych. Stare standardy C nie mają wbudowanego typu „bool”, więc jest to obejście.

Jeśli nie podoba Ci się słowo „pływać”, możesz napisać:

Potem:

Umieść instrukcje typedef w dowolnym miejscu programu. Tylko upewnij się, że wyjdą przed pierwszym użyciem.

Struktury

Struktury w C grupują zmienne w jeden pakiet.

Za każdym razem, gdy chcesz zadeklarować strukturę typu rec, musisz napisać struct rec. Łatwo zapomnieć. Jeśli pominiesz słowo struct, kompilator zgłosi błędy.

Możesz skrócić kod:

Tutaj deklaracja typu i zmienna r są zadeklarowane w tej samej instrukcji.

Lub użyj typedef jako nazwy struktury. Jeśli jesteś zmęczony pisaniem za każdym razem struct rec r :

Następnie zadeklaruj wpisy, podając:

Odwołaj się do pól, używając kropki. r.a = 5;.

Tablice

Tablice deklaruje się poprzez określenie rozmiaru po zwykłej deklaracji.

Tablice to ciągłe bloki pamięci. Dostęp do indeksu spoza zakresu jest zachowaniem niezdefiniowanym. Program może zakończyć się błędem. Dane mogą zostać uszkodzone. Może się wydawać, że wszystko działa, aż nagle tak się nie dzieje.

Zwiększanie i zmniejszanie

C zawiera skróty do typowych operacji.

  • i = i + 1; staje się i++;
  • i = i - 1; staje się i--;
  • i = i + 3; staje się i += 3;
  • i = i * j; staje się i *= j;

To nie tylko cukier syntaktyczny. Często są one kompilowane w bardziej wydajny kod maszynowy. Użyj ich.

C Błędy, których należy unikać

Operator / z dwiema liczbami całkowitymi jest pułapką. Odrzuca część dziesiętną. Zawsze sprawdzaj typy przed podziałem. Jeśli potrzebujesz precyzji, rzuć najpierw jeden z operandów na float lub double.

Pomyśl o tym za każdym razem, gdy użyjesz tego operatora. W przeciwnym razie Twoje liczby będą błędne. A debugowanie problemów związanych z dzieleniem liczb całkowitych jest uciążliwe.

Spróbuj sam

  • Eksperymentuj z rzutowaniem typów. Wypróbuj int, char, float. Zobacz, co się stanie, gdy je zmieszasz.
  • Utwórz tablicę rekordów. Napisz kod sortujący tę tablicę według jednego pola całkowitego. Dzięki temu dowiesz się, jak pracować ze wskaźnikami, układem pamięci i kontrolą przepływu.

W C liczą się szczegóły. Pomiń jeden typ i cały program się zepsuje. Zrób to dobrze, a zadziała szybko.