PrePost IncrementDecrement 运算符
在 C 中,有两个一元运算符 - ‘++‘和’ - ‘是非常常见的混淆源。运算符++
称为递增运算符,运算符 --
称为递减运算符。它们都可以用于前缀形式或后缀形式。++
运算符的前缀形式的语法是++operand
,后缀形式的语法是 operand++
。当在前缀形式中使用时,操作数首先由 1
递增,并且操作数的结果值用于表达式的求值。请考虑以下示例:
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 ; */
在后缀形式中使用时,操作数的当前值在表达式中使用,然后操作数的值增加 1
。请考虑以下示例:
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; */
可以类似地理解减量运算符 --
的工作。
以下代码演示了每个人的功能
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;
}
从上面可以清楚地看出,post 运算符返回变量的当前值然后修改它,但是 pre 运算符修改变量然后返回修改后的值。
在 C 的所有版本中,未定义前置和后置运算符的求值顺序,因此以下代码可以返回意外输出:
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;
}
请注意,在声明中单独使用 pre pre post 运算符也是一种好习惯。请看上面的代码。
另请注意,在调用函数时,必须在函数运行之前对参数产生所有副作用。
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;
}