Delen via


Neveneffecten

De volgorde van evaluatie van expressies wordt gedefinieerd door de specifieke implementatie, behalve wanneer de taal een bepaalde evaluatievolgorde garandeert (zoals beschreven in prioriteit en volgorde van evaluatie). Bijwerkingen treden bijvoorbeeld op in de volgende functieaanroepen:

add( i + 1, i = j + 2 );
myproc( getc(), getc() );

De argumenten van een functieoproep kunnen in elke volgorde worden geëvalueerd. De expressie i + 1 kan vóór i = j + 2of i = j + 2 vóór i + 1worden geëvalueerd. Het resultaat is in elk geval anders. Op dezelfde manier is het niet mogelijk om te garanderen welke tekens daadwerkelijk worden doorgegeven aan de myproc. Aangezien unaire incrementele en aflopende bewerkingen toewijzingen omvatten, kunnen dergelijke bewerkingen neveneffecten veroorzaken, zoals wordt weergegeven in het volgende voorbeeld:

x[i] = i++;

In dit voorbeeld is de waarde ervan x onvoorspelbaar. De waarde van het subscript kan de nieuwe of de oude waarde van izijn. Het resultaat kan variëren onder verschillende compilers of verschillende optimalisatieniveaus.

Aangezien C de volgorde van de evaluatie van bijwerkingen niet definieert, zijn beide hierboven besproken evaluatiemethoden juist en kunnen beide worden geïmplementeerd. Om ervoor te zorgen dat uw code draagbaar en duidelijk is, vermijdt u instructies die afhankelijk zijn van een bepaalde volgorde van evaluatie voor bijwerkingen.

Zie ook

Expressie-evaluatie