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;
    }