C Language
Bijwerkingen
Zoeken…
Pre / post toename / afname operators
In C zijn er twee unaire operatoren - '++' en '-' die veel voorkomende verwarring veroorzaken. De operator ++
wordt de increment-operator genoemd en de operator --
wordt de decrement-operator genoemd . Beide kunnen worden gebruikt in prefix- of postfix- vorm. De syntaxis voor voorvoegselformulier voor operator ++
is ++operand
en de syntaxis voor postfixformulier is operand++
. Bij gebruik in het voorvoegsel wordt de operand eerst met 1
verhoogd en wordt de resulterende waarde van de operand gebruikt bij de evaluatie van de uitdrukking. Overweeg het volgende voorbeeld:
int n, x = 5;
n = ++x; /* x is incremented by 1(x=6), and result is assigned to n(6) */
/* this is a short form for two statements: */
/* x = x + 1; */
/* n = x ; */
Bij gebruik in de postfix-vorm, wordt de huidige waarde van de operand gebruikt in de uitdrukking en vervolgens wordt de waarde van de operand verhoogd met 1
. Overweeg het volgende voorbeeld:
int n, x = 5;
n = x++; /* value of x(5) is assigned first to n(5), and then x is incremented by 1; x(6) */
/* this is a short form for two statements: */
/* n = x; */
/* x = x + 1; */
De werking van de verlagingsoperator --
kan op dezelfde manier worden begrepen.
De volgende code laat zien wat iedereen doet
int main()
{
int a, b, x = 42;
a = ++x; /* a and x are 43 */
b = x++; /* b is 43, x is 44 */
a = x--; /* a is is 44, x is 43 */
b = --x; /* b and x are 42 */
return 0;
}
Uit het bovenstaande is duidelijk dat postoperators de huidige waarde van een variabele retourneren en deze vervolgens wijzigen, maar pre-operators wijzigen de variabele en retourneren vervolgens de gewijzigde waarde.
In alle versies van C is de volgorde van evaluatie van pre- en postoperators niet gedefinieerd. Daarom kan de volgende code onverwachte resultaten opleveren:
int main()
{
int a, x = 42;
a = x++ + x; /* wrong */
a = x + x; /* right */
++x;
int ar[10];
x = 0;
ar[x] = x++; /* wrong */
ar[x++] = x; /* wrong */
ar[x] = x; /* right */
++x;
return 0;
}
Merk op dat het ook een goede gewoonte is om pre-post-operatoren te gebruiken wanneer deze alleen in een verklaring worden gebruikt. Bekijk hiervoor de bovenstaande code.
Merk ook op dat wanneer een functie wordt aangeroepen, alle bijwerkingen op argumenten moeten plaatsvinden voordat de functie wordt uitgevoerd.
int foo(int x)
{
return x;
}
int main()
{
int a = 42;
int b = foo(a++); /* This returns 43, even if it seems like it should return 42 */
return 0;
}