C-gegevenstypen, casting en structuren begrijpen

12

C is streng over wat het in het geheugen bewaart. Het raadt niet. Je moet precies vertellen wat voor soort gegevens je opslaat. Dit is niet alleen pedanterie. Het beïnvloedt hoe uw programma draait, hoeveel geheugen het gebruikt en of uw berekeningen goed of slecht uitkomen.

De standaardvariabeletypen

Er zijn drie standaard typen variabelen in C.

Geheel getal: int
Dit is een geheel getal van 4 bytes. Het verwerkt hele getallen.

Zwevend punt: zweven
Dit is een drijvende-kommawaarde van 4 bytes. Het verwerkt decimalen.

Karakter: char
Dit is een enkel teken van 1 byte. Denk aan “a” of “3”. Een string in C is slechts een array van deze karakters.

Dan zijn er afgeleide typen. Je gebruikt ze als de standaard drie het niet redden.

  • double : een drijvende-kommawaarde van 8 bytes. Meer precisie.
  • kort : een geheel getal van 2 bytes. Minder geheugen, minder bereik.
  • unsigned short of unsigned int : Deze verwerken alleen positieve gehele getallen. Geen tekenbit. Als u populatieaantallen of pakketgroottes wilt bijhouden, is dit vaak de juiste keuze.

Operators en prioriteit van operators

De operators in C zien er bekend uit.

  • + toevoeging
  • - aftrekken
  • / verdeling
  • * vermenigvuldiging
  • % mod

Maar pas op voor verdeeldheid. De operator / voert een deling van gehele getallen uit als beide operanden gehele getallen zijn. Anders voert het een drijvende-kommaverdeling uit.

Kijk naar deze code:

Er wordt een drijvende-kommawaarde afgedrukt omdat a is gedeclareerd als het type float. Maar ‘a’ zal 3.0 zijn. Waarom? Omdat de code eerst een gehele deling uitvoerde. 10 gedeeld door 3 is 3. Het resultaat is 3. Vervolgens wordt die 3 geconverteerd naar 3,0 wanneer deze wordt opgeslagen in a. De precisie ging verloren voordat deze zelfs maar de variabele raakte.

Operatorprioriteit in C volgt standaardregels. Delen en vermenigvuldigen gebeuren vóór optellen en aftrekken.

Het resultaat van 5+3*4 is 17. Niet 32. De operator * heeft een hogere prioriteit dan +. U kunt dit overschrijven met haakjes. (5+3)*4 is 32. De 5+3 wordt eerst geëvalueerd.

Voorrang wordt later rommelig. Zodra er aanwijzingen in de chat binnenkomen, wordt het ingewikkeld. Maar onthoud voor nu: vermenigvuldig en deel voordat je optelt en aftrekt.

Typecasting

Met C kunt u typen direct converteren. Dit doe je vaak met aanwijzingen. Voor bepaalde typen gebeurt dit ook automatisch tijdens de toewijzing.

In het bovenstaande voorbeeld werd het gehele resultaat van 10/3 automatisch geconverteerd naar een float. Maar wat als je het decimaalteken wilde?

U voert typecasting uit door de typenaam tussen haakjes vóór de waarde te plaatsen.

Vervang a=10/3; door a=(float)10/3;.

Nu is ‘a’ 3,33333. De 10 wordt vóór de deling omgezet in een drijvende-kommawaarde. De verdeling vindt plaats in drijvende-kommaland. Het resultaat behoudt de decimalen.

Typedef

Je kunt benoemde, door de gebruiker gedefinieerde typen in C declareren met de typedef -instructie. Dit is gebruikelijk in C-code.

Hiermee kunt u Booleaanse typen declareren. C heeft in oudere standaarden geen native bool -type, dus dit is een oplossing.

Als je het woord ‘zweven’ niet leuk vindt, kun je zeggen:

Dan later:

Plaats typedef -instructies ergens in het programma. Zorg er wel voor dat ze vóór het eerste gebruik binnenkomen.

Structuren

Structuren in C-groepsvariabelen tot een pakket.

Wanneer u structuren van het type rec wilt declareren, moet u struct rec zeggen. Dit is gemakkelijk te vergeten. Als u de struct weglaat, krijgt u compilerfouten.

Je kunt de code comprimeren:

Hier worden de typedeclaratie en de variabele r in dezelfde instructie gedeclareerd.

Of gebruik typedef voor de structuurnaam. Als je er een hekel aan hebt om elke keer struct rec r te typen:

Verklaar vervolgens records door te zeggen:

Toegang tot velden met een punt. r.a = 5;.

Arrays

U declareert arrays door een grootte in te voegen na de normale declaratie.

Arrays zijn aaneengesloten geheugenblokken. Toegang tot een index buiten de grenzen is ongedefinieerd gedrag. Het zou kunnen crashen. Het kan gegevens beschadigen. Het lijkt misschien te werken totdat het niet meer werkt.

Ophogen

C heeft snelkoppelingen voor algemene bewerkingen.

  • i = i + 1; wordt i++;
  • i = i - 1; wordt i--;
  • i = i + 3; wordt i += 3;
  • i = i * j; wordt i *= j;

Dit zijn niet alleen syntactische suikers. Ze compileren vaak naar efficiëntere machinecode. Gebruik ze.

C-fouten die u moet vermijden

De / operator met twee gehele getallen is een trap. Het kapt het decimale deel af. Controleer altijd uw typen voordat u gaat delen. Als je precisie nodig hebt, gebruik dan eerst een operand voor ‘float’ of ‘double’.

Denk er eens over na wanneer u het gebruikt. Anders kloppen uw cijfers niet. En het oplossen van problemen met deling van gehele getallen is pijnlijk.

Probeer dit

  • Experimenteer met typecasting. Probeer int, char, float. Kijk wat er gebeurt als je ze mengt.
  • Maak een reeks records. Schrijf code om die array op één geheel getalveld te sorteren. Het leert je over pointers, geheugenindeling en controlestroom.

De details zijn belangrijk in C. Als je één type mist, stopt het hele programma. Doe het goed, en het werkt snel.