ProgrammatieMiddle Backend ontwikkelaar

Leg de werking van de komma-operator (comma operator) in de taal C uit. Wanneer is het gebruik ervan gerechtvaardigd en welke onverwachte bijwerkingen kunnen optreden bij een onduidelijk begrip van de rekenvolgorde?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

De komma-operator (,) in C stelt je in staat om meerdere uitdrukkingen te combineren, waarvan het resultaat de waarde van de laatste uitdrukking is.

Voorbeeld:

int a = 1, b = 2, c; c = (a += 2, b += 3, a + b); // verhoog eerst a, dan b, en tel a + b op

Gebruik:

  • Vaak gebruikt in de kop van een for-lus, waar meerdere acties moeten worden uitgevoerd.
  • Soms gebruikt voor het combineren van uitdrukkingen in macro's en complexe uitdrukkingen.

Fijnere details:

  • De komma-operator heeft de laagste prioriteit onder binaire operatoren.
  • In initialisatielijsten, argumentlijsten en enumeraties is de komma geen operator! Hier fungeert deze als scheidingsteken.
  • De uitdrukkingen in de komma-operator worden van links naar rechts geëvalueerd.

Voorbeeld van een lus:

for (i = 0, j = 10; i < j; ++i, --j) { /* ... */ }

Misleidende vraag.

Wat is het verschil tussen de komma als operator en als scheidingsteken in de argumentenlijst van een functie?

Veelgemaakte fout: Men denkt dat de komma op elk punt een operator is en altijd uitdrukkingen verbindt.

Juiste antwoord: De komma is alleen een operator buiten initialisatielijsten, argumenten en array-elementen. Bijvoorbeeld:

int x = (1, 2); // x == 2, hier is het een operator void foo(int a, int b) { ... } // hier is het een scheidingsteken

De komma als operator werkt alleen binnen haakjes, in andere gevallen is het gewoon een scheidingsteken.

Voorbeelden van echte fouten door onbekendheid met de subtiliteiten van het onderwerp.


Verhaal

Een macro, waar binnen do { ... } while (0) de komma-operator werd gebruikt om instructies zonder haakjes te combineren, leidde ertoe dat iets als if (a) MACRO(); else ... een syntaxisfout veroorzaakte vanwege de verkeerde syntaxis van de macro.


Verhaal

Verwarring tussen de prioriteit van de komma-operator en de prioriteit van toekenning leidde ertoe dat de uitdrukking a = b, c = d; werkte als (a = b), (c = d), terwijl de programmeur dacht dat beide toekenningen gelijktijdig werden uitgevoerd als onderdeel van één enkele uitdrukking.


Verhaal

In een functie werd een komma gebruikt voor opeenvolgende functieaanroepen, maar het werd genegeerd dat alleen de laatste waarde werd geretourneerd. Er werd aangenomen dat de resulterende uitdrukking de effecten van alle aanroepen combineerde, terwijl in feite alleen de bijeffecten van de eerste aanroepen belangrijk waren, en hun geretourneerde waarden verloren gingen.