Zie Scherp Scherper - Hoofdstuk 2
Je jas, je gsm, je sporttas: waar laat je die?
Een programma heeft hetzelfde probleem: het moet dingen ergens kwijt.
Na dit hoofdstuk kan je:
de C#-syntax en de rol van keywords uitleggen
geldige identifiers herkennen en variabelen volgens de conventies benoemen
de belangrijkste datatypes kiezen (int, double, bool, char, string, …)
variabelen declareren, initialiseren en literals correct schrijven
expressies en operators gebruiken, inclusief de valkuil van gehele deling
constanten gebruiken en de structuur van solutions en projecten uitleggen
Net als elke taal bestaat C# uit:
grammatica
de C#-syntax
woordenschat
de gereserveerde keywords
Een programma is een opeenvolging van statements, en elk statement eindigt op een puntkomma (;).
Eén statement = één lijn in je recept, het algoritme.
Aa Hoofdlettergevoelig: Reinhardt en reinhardt zijn niet hetzelfde
; Puntkomma sluit elk statement af
Witruimte (spaties, tabs, enters) wordt genegeerd, behalve tussen " "
// Commentaar mag: // voor één lijn, /* ... */ voor een blok
Je code start altijd in Main
Uitvoering gaat van boven naar onder
C# heeft 80 gereserveerde keywords met een vaste, eenduidige betekenis
Doorheen het boek leren we ze stelselmatig gebruiken.
Tip
C# is een levende taal. Nieuwe woorden komen erbij als contextual keywords (bv. get, set, value, var); de lijst van 80 echte keywords verandert niet.
Don’t use goto!
goto is een officieel keyword, maar je ziet het in dit boek nooit.
gotoWaarschuwing
NEVER EVER USE GOTO. Enneuh, ik hou je in ’t oog hoor.
Een variabele is een geheugenplekje waarin we tijdelijk data bewaren (bv. gebruikersinput).
het nummer op de deur: het geheugenadres
het naambordje dat jij erop plakt: de identifier
de maat van het kluisje: het datatype
wat erin zit: de waarde, altijd maar één
Bij het aanmaken geef je minstens twee zaken mee:
een identifier
de gebruiksvriendelijke naam voor die geheugenplek
een datatype
wat voor soort data erin mag
optioneel: meteen een beginwaarde
int mijnLeeftijd = 37;
Jij spreekt het kluisje aan met de identifier, de computer met het geheugenadres.
werknemer
ja
kerst2018
ja
pippo de clown
nee (spaties)
4dPlaats
nee (start cijfer)
_ILOVE2022
ja
Tor+Bjorn
nee (+)
class
nee (keyword)
Duidelijke naam
liever gewicht of leeftijd dan a of meuh
camelCasing bij meerdere woorden
elk volgend woord met een hoofdletter, het eerste woord met een kleine letter
// zet alles tot het einde van de lijn in commentaar
/* */ zet een volledig blok in commentaar
Handig om tijdelijk code “uit te schakelen”
C# is een strongly typed language: je legt van bij de start vast welk soort data een variabele bevat.
Tip
Anders dan in JavaScript kan data hier niet zomaar van vorm veranderen. Dat is soms strenger, maar bespaart je veel gevloek.
In dit boek gebruiken we types voor:
gehele getallen
sbyte, byte, short, ushort, int, uint, long, ulong
kommagetallen
double, float, decimal
tekst
char, string
booleans
bool
| Geheugen | Met teken (signed) | Enkel positief (unsigned) |
|---|---|---|
| 8 bits | sbyte: -128 tot 127 |
byte: 0 tot 255 |
| 16 bits | short: -32 768 tot 32 767 |
ushort: 0 tot 65 535 |
| 32 bits | int: ca. -2,1 tot +2,1 miljard |
uint: 0 tot ca. 4,3 miljard |
| 64 bits | long: ca. -9,2 tot +9,2 triljoen |
ulong: 0 tot ca. 18,4 triljoen |
Een u vooraan = unsigned: ushort, uint en ulong zijn de positieve versies van de gewone types
byte is de uitzondering: die is al positief, dus heet de versie met teken sbyte (s = signed)
Tip
Dubbel zoveel bits verdubbelt het bereik niet, het kwadrateert het: 256 waarden bij een byte, 65 536 bij een short. Bij twijfel kies je gewoon int.
Elk volgend type neemt dubbel zoveel geheugen in.
Bij elk signed type, hier een short, gaat het eerste bitje naar het teken.
“Wow, moet ik al die datatypes vanbuiten kennen? Ik was al blij dat ik tekst op het scherm kon tonen.”
Nee. Onthoud de belangrijkste, en door veel te programmeren ontdek je vanzelf welk type waar past. Laat je niet afschrikken door de ellenlange tabellen: we gebruiken er maar een handvol.
In Zwitserland mag een trein niet exact
256
assen hebben. Waarom?
Opgelost met een regel in het reglement, niet met een groter datatype.
| Type | Geheugen | Sterkte |
|---|---|---|
float |
32 bits | kleinst |
double |
64 bits | grootste bereik |
decimal |
128 bits | hoogste precisie (28-29 cijfers) |
decimal vooral voor financiële en wetenschappelijke code
Precisie = aantal beduidende cijfers (2.2345 heeft precisie 5)
Tip
Bij twijfel kies je voor kommagetallen double.
Elk type wint op precies één van de drie criteria. Het rode balkje toont welk.
bool: het eenvoudigste type, enkel true of false (neemt 1 byte in)
onmisbaar bij beslissingen (if) vanaf een later hoofdstuk
char: één enkel karakter (zie volgende hoofdstuk)
string: een stuk tekst (een reeks van chars)
Waarschuwing
Weet je dat een variabele maar twee waarden kan hebben? Gebruik dan een bool, geen int. Scheelt geheugen en is duidelijker.
De boordcomputer van Apollo 11 had
4 KB
werkgeheugen.
Je smartphone: miljoenen keren meer.
Daar kies je je datatypes nog wel met de hand.
Koperdraad door het ringetje: 1. Errond: 0.
Bugs eruit halen kon niet meer. Dus: veeeeeelvuldig testen.
Toekenning gaat van rechts naar links: het deel rechts van = gaat naar links.
Tip
Meerdere variabelen van hetzelfde type mogen op één lijn: string voornaam, achternaam, adres;
Een literal is een waarde die je letterlijk neerschrijft. De schrijfwijze bepaalt het type:
Gehele getallen zijn standaard int, kommagetallen standaard double
Suffixen: u (uint), L (long), f (float), m (decimal)
Belangrijk
Dit compileert niet eens. Het = 5 hoort enkel bij breedte, de laatste van het rijtje. lengte blijft zonder waarde: use of unassigned local variable. Wil je allebei 5, schrijf dan int lengte = 5, breedte = 5;
Een nieuwe waarde wist de oude onherroepelijk:
Op de tweede lijn staat geen type: je kent een nieuwe waarde toe, je declareert niet opnieuw.
Belangrijk
Declareer een variabele maar één keer. double kdRating = 2.1; gevolgd door double kdRating = 3.4; geeft already defined in this scope.
Heb je de oude waarde nog nodig, zet ze dan eerst in een tweede variabele.
Je hebt twee variabelen. Hoe wissel je hun waarden om?
Belangrijk
a = b; b = a; werkt niet: na a = b is de oude waarde van a al weg.
YouTube telde views in een int, en dat gaat tot
2 147 483 647
Genoeg voor elke video, toch?
“We never thought a video would be watched in numbers greater than a 32-bit integer (=2,147,483,647 views), but that was before we met PSY.”
De teller werd vervangen door een 64 bits long.
Een expressie is een reeks bewerkingen die uitkomt op één resultaat met een type. 3 + 2 geeft 5 (type int).
Volgorde van berekeningen, net als in de wiskunde:
*, /, %+, -In 3 + 2 zijn 3 en 2 de operanden en is + de operator.
Hoeveel zou je wegen op Mars?
Literals, variabelen en operators samen, met haakjes om de volgorde af te dwingen.
De %-operator geeft de gehele rest van een deling:
Tip
% 2 is dé manier om te testen of een getal even is: is de rest 0, dan is het even.
De linkse operand staat links van de streep, de rechtse rechts. Wat onderaan overblijft, geeft % terug.
Compacter om te lezen, niet sneller. getal++ zie je overal (zeker in lussen), dus je moet het vlot kunnen lezen.
Belangrijk
som++ (achteraan): geef eerst de waarde terug, dan verhogen++som (vooraan): eerst verhogen, dan de nieuwe waarde teruggevengetal++ of ++getalLinks geeft getal eerst zijn waarde af, rechts verhoogt het eerst.
Zet je helm op. Als je de volgende sectie goed begrijpt, heb je een grote stap gezet.
Variabelen zijn het hart van programmeren. Expressies zijn het bloedvatensysteem dat ze combineert tot iets nieuws.
De types die je in een expressie gebruikt, bepalen het type van het resultaat.
int + int geeft een int. Een double kan je niet zomaar aan een int toewijzen.
Waarschuwing
Op het scherm verschijnt 4, niet 4.5.
int / int geeft altijd een intC# kapt alles na de komma af (truncatie), het rondt niet af. Ook 4.9 wordt zo 4.
Januari 1982: een nieuwe beursindex op
1000
3000 keer per dag herberekend, en telkens afgekapt. Waar staat hij bijna twee jaar later?
524,811
afgekapt
1098,892
juist berekend
Meng je een int met een double, dan kiest C# het grootste type (hier double):
Wil je 9 / 2 als 4.5, zet dan minstens één operand op double:
Ik verdien 10 000 euro per maand (I wish) en geef je de helft:
Met const maak je een variabele onveranderlijk:
Conventie: een const in ALLCAPS met liggende streepjes
Vermijd losse magic numbers: geef ze een duidelijke naam
Visual Studio organiseert je code in een hiërarchie:
een solution is een map met één of meer projecten
een project bundelt codebestanden tot één uitvoerbaar geheel
Daarom raden we aan om “Place solution and project in the same directory” niet aan te vinken.
Waarschuwing
Een .sln-bestand bevat geen code. Wil je je werk delen, geef dan de hele folderstructuur mee.
C# = syntax (grammatica) + keywords (woordenschat); statements eindigen op ;
Een variabele = identifier + datatype; geef ze altijd meteen een beginwaarde
Kies je datatype bewust: int en double als veilige standaard
Expressies volgen de wiskundige volgorde, maar let op int / int: dat kapt af
const maakt waarden onveranderlijk; solutions bundelen projecten
Tip
Volgende halte: alles over tekst: char, string en hun trucjes.
Kennisclips
Hoe doen andere programmeertalen hetzelfde? En een korte zoek-de-fout, om zo kritisch mogelijk naar code te leren kijken.
Onderstaande C#-code wil de helft van een prijs berekenen, maar toont altijd 0. Wat loopt er mis?
Opmerking
1 / 2 is een deling van twee gehele getallen, en die geeft opnieuw een geheel getal: 0, niet 0.5. De vermenigvuldiging wordt dan 5 * 0, dus 0. Dat helft een double is, helpt niet: de fout zit al in de int-deling die ervoor gebeurt. Maak minstens één kant een kommagetal, bijvoorbeeld prijs * (1.0 / 2).
Dezelfde concepten uit dit hoofdstuk, maar dan in andere talen. Je hoeft die talen niet te kennen: het gaat om het herkennen van het patroon, ook al ziet de syntax er anders uit.
Belangrijk
Steeds vaker laat je een A.I. een eerste versie schrijven en moet je die daarna lezen, beoordelen en bijsturen. Zo’n A.I. spuwt even vlot Python, JavaScript of C++ uit als C#.
In Python geef je nooit een type op. Diezelfde variabele mag later zelfs een ander soort data bevatten:
In C# blijft een int een int: regel twee zou hier een compilatiefout geven.
Handig om te weten: zo’n stukje Python kan je nu al grotendeels lezen, ook al schrijf je het zelf nog niet.
Die hele waaier integer-types deelt C# met C en C++: ook daar kies je tussen short, int, long, … omdat geheugen telt.
JavaScript doet het omgekeerde: één enkel getaltype number, altijd een 64-bit kommagetal.
Handig, maar het verklaart waarom JS onnauwkeurig wordt bij heel grote gehele getallen.
bool overal?Niet vanzelfsprekend. De oude C-standaard had geen booleantype: men gebruikte een int, met 0 als false en al de rest als true.
C# (net als Java en Python) maakt van true en false echte, aparte waarden, zodat je geen getal per ongeluk als conditie gebruikt.
const in PythonPython kent geen echt const-keyword. Een naam in ALLCAPS is er enkel een afspraak, geen regel die de taal afdwingt.
In C# vangt de compiler die tweede regel meteen op: de taal dwingt de belofte af.
Een handige samenvattende poster (Opgelet: gemaakt m.b.v. ChatGPT Image Gen 2).