In de C-taal worden de vergelijkingsoperators (==, !=, <, >, <=, >=) en de toewijzingsoperator (=) onderscheiden, zowel in semantiek als in prioriteit. Historisch gezien hebben fouten tussen deze operaties geleid tot bugs in software; bijvoorbeeld, het verwarren van = en == was vaak de oorzaak van moeilijk herkenbare fouten.
Probleem: De grootste moeilijkheid ontstaat door de lage prioriteit van de toewijzingsoperator (=) in vergelijking met de vergelijkingsoperators. Bovendien retourneert toewijzing een waarde (rvalue), waardoor het mogelijk is om expressies zoals while(x = y) te schrijven, wat soms leidt tot ongewenste of onduidelijke gevolgen.
Oplossing: Het is belangrijk om == en = duidelijk te onderscheiden, hun prioriteiten in een expressie te begrijpen, haakjes en linters te gebruiken om dergelijke fouten op te sporen. In complexe expressies altijd haakjes gebruiken voor duidelijkheid.
Voorbeeld code:
int a = 5, b = 3; if (a = b) { // fout: toewijzing, geen vergelijking printf("a == b "); }
Correct:
int a = 5, b = 3; if (a == b) { printf("a == b "); }
Belangrijkste kenmerken:
Wat is het verschil tussen '==' en '=' in C, en wat gebeurt er als je ze in een voorwaarde verwisselt?
== is een vergelijkingsoperator, = is een toewijzingsoperator. Als je = in plaats van == gebruikt, ontvangt de variabele de toegewezen waarde en controleert de voorwaarde deze waarde als boolean. Dit is een veelvoorkomende oorzaak van bugs.
Is het mogelijk om ketens van toewijzingen te schrijven, bijvoorbeeld a = b = c = 0? Wat gebeurt er dan?
Ja, in C werkt de toewijzingsoperator van rechts naar links. Eerst wordt 0 toegewezen aan c, vervolgens wordt deze waarde toegewezen aan b, en daarna aan a. Alle variabelen krijgen 0.
Voorbeeld code:
int a, b, c; a = b = c = 0;
Waarom is de uitdrukking 'if (a = 0)' niet hetzelfde als 'if (a == 0)'?
In de uitdrukking if (a = 0) vindt de toewijzing 0 aan a plaats. De voorwaarde is altijd onwaar (aangezien het resultaat van de toewijzing gelijk is aan 0), en staat niet voor een "vergelijking". Het moet if (a == 0) zijn.
Een programmeur schrijft een while-lus (x = data[i]) en verwacht dat de voorwaarde waar wordt wanneer x gelijk is aan nul. In werkelijkheid eindigt de lus alleen wanneer data[i] gelijk is aan 0 in waarde, en niet wanneer x gelijk is aan data[i].
Voordelen:
Nadelen:
Strikte scheiding van expressies, duidelijke vergelijking en toewijzing. Gebruik van linters om de code te controleren.
Voordelen:
Nadelen: