基本概念

  • value--(后缀递减):先使用值,再减1
  • --value(前缀递减):先减1,再使用值
  • value++(后缀递增):先使用值,再减1
  • ++value(前缀递增):先加1,再使用值

下面有这样一个问题,请先看代码:

#include <iostream>

void fun(int x) {
    std::cout << "Parameter value: " << x << std::endl;
}

// 后缀递减示例
void postfix_example() {
    int value = 2;
    fun(value--);  // 传入2,之后value变为1
    std::cout << "After call: " << value << std::endl;
    
    // 输出:
    // Parameter value: 2
    // After call: 1
}

// 前缀递减示例
void prefix_example() {
    int value = 2;
    fun(--value);  // 先将value减为1,然后传入1
    std::cout << "After call: " << value << std::endl;
    
    // 输出:
    // Parameter value: 1
    // After call: 1
}

看到的上面的代码,func内部会输出什么?整个的执行顺序是什么?

原理解析

要回答上面的问题,要首先要搞明白一件事:

  1. value--是一个表达式,表达式的值与value的最终值没有关系,表达式的值是前面章节中的使用值

以前面的例子说明:

  1. value的初始值为2
  2. value--表达式,由于这是一个后缀递减运算,所以表达式的值就是2;到了这一步表达式就结束了,后面的value自减1运算与这个表达式就没有任何关系了

如果代码写成下面的样子大家都能看懂:

void postfix_example() {
    int value = 2;
    value--;  //这里value变成了1,
    fun(value);  // 传入1
    std::cout << "After call: " << value << std::endl;
    
    // 输出:
    // Parameter value: 1
    // After call: 1
}

容易造成大家疑惑的地方就是:如果自减/自减表达式作为函数参数,函数因为使用了这个表达式的值,而很多朋友对这个表达式的值具体是多少或者说传入函数的值是多少存在疑问。

现在在这里非常明确的告诉大家:

c++自增/自减表达式的值需要严格结合自增自减运算符的概念进行理解,下面我举出下面的例子:

int value = 5;
std::cout<<value--<<std::end;  //输出5

int value = 5;
std::cout<<--value<<std::end;  //输出4


int value = 5;
std::cout<<value++<<std::end;  //输出5

int value = 5;
std::cout<<++value<<std::end;  //输出6

执行顺序

下面分析代码的执行顺序:

fun(value--);

这行代码的执行顺序是:

  1. value-- 表达式被求值:

    • 保存 value 的当前值(称为临时值)
    • 将 value 减 1
    • 返回之前保存的临时值
  2. 返回的临时值作为参数传递给 fun 函数

更多推荐