Basis van programmeren in C
Leer met meerkeuzevragen waarin korte code wordt getraceerd over de groottes van integertypen en integertypen met vaste breedte, integerpromotie en conversie tussen typen met en zonder teken, operatorvoorrang, bitsgewijze bewerkingen, switch-statements, doorgeven als waarde en pointers, static-variabelen, arrays en pointerrekenkunde, strings en sizeof, const, functiepointers, malloc, free en geheugenlekken, dangling pointers, bufferoverlopen, padding in structs, unions en endianness, bitvelden, macro's en voorwaardelijke compilatie, volatile, en ongedefinieerd gedrag.
Basis van programmeren in C: kernpunten
C wordt nog steeds veel gebruikt voor software dicht bij de hardware, zoals besturingssystemen, apparaatstuurprogramma's en de firmware van microcontrollers. Met C kunnen geheugenadressen rechtstreeks worden behandeld en kan snelle code worden geschreven, maar de taal kent ook veel regels waarvan fouten moeilijk op te merken zijn als men ze niet kent: de grootte van int verschilt per implementatie, typen veranderen midden in een berekening, en niets houdt een programma tegen dat voorbij het einde van een array schrijft.
U leert vooral met vragen waarin u de uitvoer van korte code bij het werkelijk uitvoeren traceert. Aan bod komen de groottes van integertypen en de integertypen met vaste breedte uit stdint.h, gehele deling, integerpromotie en vergelijkingen tussen waarden met en zonder teken, operatorvoorrang, bitsgewijze bewerkingen, kortsluitevaluatie, fall-through in switch-statements, doorgeven als waarde en doorgeven van pointers, static-variabelen en levensduur, pointerrekenkunde en arrays, de indeling van tweedimensionale arrays, strings met strlen en sizeof, de plaats van const, en functiepointers. Daarna gaat het om malloc en free, geheugenlekken, dangling pointers, bufferoverlopen, NULL-pointers, padding in structs, unions en endianness, bitvelden, macro's en include guards, voorwaardelijke compilatie, volatile in embedded code, en ongedefinieerd gedrag en optimalisatie door de compiler. De uitvoer van de programma's is gecontroleerd door de code werkelijk te compileren met gcc onder Linux op x86-64. Het traceren van pseudocode wordt behandeld in „Basis van programmeren (pseudocode traceren)”, interrupts en registertoegang met volatile in „Embedded systemen en firmware”, optimalisaties door de compiler in detail in „Compilers”, en geheugenindeling en linken in „Linker, loader en uitvoerbare formaten”.
Alle vragen over Basis van programmeren in C (40)
- Wat legt de C-standaard vast over de grootte van het type int?
- In embedded programma's wordt een variabele die de waarde van een 32-bits randapparaatregister bevat, vaak gedeclareerd met uint32_t uit stdint.h in plaats van unsigned int. Wat is de belangrijkste reden?
- Wat is de uitvoer als de bovenstaande code, die een deling van gehele getallen bevat, wordt uitgevoerd?
- Wat is de uitvoer als de bovenstaande code met prefix- en postfix-++ wordt uitgevoerd?
- Wat is de uitvoer als de bovenstaande code, met = in de voorwaarde van een if-statement, wordt uitgevoerd?
- De bovenstaande code is geschreven om te controleren of bit 2 van de registerwaarde reg 1 is. Wat is het resultaat als de code wordt uitgevoerd?
- uint8_t is een 8-bits integertype zonder teken. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
- uint8_t is een 8-bits integertype zonder teken. Wat is de uitvoer als de bovenstaande code, die x tien keer verhoogt, wordt uitgevoerd?
- unsigned char is 8 bits en int is 32 bits. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
- uint8_t is een 8-bits integertype zonder teken en int is 32 bits. Wat is het resultaat als de bovenstaande code wordt uitgevoerd?
- int en unsigned int zijn 32 bits. Wat is het resultaat als de bovenstaande code wordt uitgevoerd?
- unsigned int is 32 bits. Welke beschrijving van het gedrag bij het uitvoeren van de bovenstaande code is juist?
- Een programma dat „char c = 200;” instelt en c met %d in printf afdrukt, gaf −56 na compileren en uitvoeren met gcc voor Linux op x86-64, en 200 met gcc voor Linux op Arm. Wat is de reden voor dit verschil?
- Wat is de uitvoer als de bovenstaande code, met b++ aan de rechterkant van && en ||, wordt uitgevoerd?
- Wat is de uitvoer als het bovenstaande switch-statement, met een case zonder break, wordt uitgevoerd?
- Wat is de uitvoer als het bovenstaande programma wordt uitgevoerd?
- Wat is de retourwaarde van de derde aanroep als de bovenstaande functie f drie keer achter elkaar wordt aangeroepen?
- Welke combinatie van de levensduur van (1) een lokale variabele die binnen een functie zonder static is gedeclareerd, (2) een met malloc gereserveerd gebied en (3) een variabele die buiten elke functie is gedeclareerd, is in C juist?
- int is 32 bits (maximum 2147483647). Wat is de grootste n waarvoor de bovenstaande functie fact(n) de faculteit van n correct en zonder overloop teruggeeft?
- int is 4 bytes en een pointer is 8 bytes. Als de waarde (het adres) van een pointer p naar int 0x1000 is, wat is dan de waarde van p + 3?
- int is 4 bytes en een pointer is 8 bytes. Wat is de uitvoer als het bovenstaande programma wordt uitgevoerd?
- int is 4 bytes. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
- Wat is de uitvoer als de bovenstaande code met een char-array die een string bevat, wordt uitgevoerd?
- Na de bovenstaande declaraties wordt een van de statements A „p = t;”, B „*p = 'x';”, C „q = t;” of D „*q = 'x';” geschreven. Welke combinatie geeft compileerfouten?
- Wat is de uitvoer als het bovenstaande programma, dat een array van functiepointers gebruikt, wordt uitgevoerd?
- fill en use zijn elders gedefinieerde functies. Wat is een probleem van de bovenstaande functie?
- Wat is juist over de pointer die de bovenstaande functie make teruggeeft?
- Wat is in C de meest passende reden waarom wordt aangeraden om direct na free(p); de regel p = NULL; te schrijven?
- De string "ABCDEFGH" van 8 tekens werd aan de bovenstaande functie save doorgegeven. Wat gebeurt er?
- Welke beschrijving van wat er in C gebeurt als een NULL-pointer wordt gederefereerd (*p wordt gelezen terwijl p NULL is), is juist?
- Neem een gebruikelijke omgeving aan waarin char 1 byte en int 4 bytes is, en int op adressen wordt geplaatst die een veelvoud van 4 zijn. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
- uint32_t en uint8_t zijn integertypen zonder teken van 32 en 8 bits, en de omgeving is little-endian. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
- Wat is de uitvoer als de bovenstaande code, die 9 opslaat in een bitveld van 3 bits, wordt uitgevoerd?
- Wat is de uitvoer als de bovenstaande code, die de met #define gedefinieerde macro SQUARE gebruikt, wordt uitgevoerd?
- Het headerbestand sensor.h is geschreven zoals hierboven. Wat is het doel van de drie regels #ifndef, #define en #endif?
- Wat is de uitvoer als de bovenstaande code binnen de functie main wordt geschreven en uitgevoerd?
- Een uitgangsregister van een microcontroller wordt gedeclareerd en gebruikt zoals hierboven. Welke beschrijving van deze declaratie is juist?
- Welke beschrijving van ongedefinieerd gedrag in de zin van de C-standaard is juist?
- int en unsigned int zijn 32 bits. Welke van de volgende bewerkingen is volgens de C-standaard ongedefinieerd gedrag?
- Als de bovenstaande functie met gcc met ingeschakelde optimalisatie wordt gecompileerd, kan de controle if (p == NULL) worden verwijderd. Wat is de reden?
Andere onderwerpen in Computersystemen
- Computerarithmetiek IEEE 754, vaste komma, afrondingsfouten
- Kansrekening, statistiek en wachtrijen Tellen, kansverdelingen, schatten en toetsen, M/M/1
- Instructieset en assembly RISC-V, adresseringsmodi, aanroepconventies
- Compilers Parsing, SSA, optimalisatie, registertoewijzing
- Linker, loader en uitvoerbare formaten ELF, symbolen, relocatie, dynamisch linken
- Besturingssysteem en hardware Interrupts, systeemaanroepen, paginafouten
- Basis van Linux en de opdrachtregel Shell, bestandsrechten, pipes, scripts
- Geheugenhiërarchie en prestaties Cache, vervangingsbeleid, drie soorten misses
- Multicore en synchronisatie MESI, atomaire instructies, geheugenbarrières
- GPU-programmeren Warps, gedeeld geheugen, coalescing, occupancy
- AI-hardware en softwarestack Inferentie vs training, kwantisatie, roofline
- Basis van machine learning Leervormen, evaluatiematen, neurale netwerken
- Embedded systemen en firmware GPIO, UART/SPI/I2C, RTOS
- Hardwarebeschrijvingstalen en verificatie Verilog, latches, toestandsmachines, testbenches
- Interfaces en busstandaarden PCIe, USB, SerDes, CXL
- Basis van computernetwerken TCP/IP, subnetberekening, DNS, TLS
- Basis van webtechnologie HTTP, cookies, REST, CORS, caching
- Basis van draadloze communicatie Modulatie, OFDM, MIMO, RF-schakelingen
- Basis van informatiebeveiliging Cryptografie, authenticatie, webaanvallen
- Basis van databases SQL, normalisatie, transacties
- Datastructuren en algoritmen Complexiteit, zoeken, sorteren, grafen
- Basis van programmeren (pseudocode traceren) Pseudocode, traceren, arrays, recursie
- Softwareontwikkeling en projectmanagement Processen, testen, planning en kosten
- Basis van bedrijfsstrategie en boekhouding Boekhouding, break-even, strategie, marketing
- IT-servicemanagement en IT-audit SLA's, incidenten en problemen, audit en interne beheersing
- Systeemarchitectuur en betrouwbaarheid Redundantie, RAID, back-ups, cloud
- Prestatiemeting en profiling Wet van Amdahl, CPI, knelpunten
- Hardwarebeveiliging Side channels, secure boot, TEE, PUF
- Energiebeheer (softwaregestuurd) DVFS, power gating, slaaptoestanden