为什么赋值运算符 = 不返回指针的值,而是返回解引用值?

时间:2020-12-29 12:22:19

标签: c++

来自What does an assignment return?

<块引用>

赋值表达式具有赋值后左操作数的值

和这段代码:

#include <iostream>
using namespace std;

int main() {
    
    int a[5] = { 0,1,2 };
    int* a_ptr = a;
    int b = (*a_ptr++ = 3); //int *b won't compile
    cout << b << endl; //3
}

计算 =(*a_ptr++ = 3)左操作数是什么?

操作数的定义是什么?在我看来,操作数是一个标识符或名称,它是 aptr

2 个答案:

答案 0 :(得分:3)

int b = (*a_ptr++ = 3);分组int b = (*(a_ptr++) = 3);。注意括号是多余的;你可以写

int b = *a_ptr++ = 3;

这在许多方面使结果更加明显,因为 =从右到左结合性使得 3 延续到 b 的值.

a_ptr++ 是一个等于 a_ptr 的表达式,但是一旦整个语句完成,它将指向数组 a 的第二个元素。由于您没有使用那个递增的指针,++ 是一个红鲱鱼,所以语句简化为

int b = *a_ptr = 3;

因此很明显 *a_ptr = 3 具有将数组 a 的第一个元素设置为 3 的效果 是一个等于 3 的表达式,它被赋值给 { {1}}。

答案 1 :(得分:1)

左操作数是 *a_ptr++。根据 operator precedence,它被评估为

*(a_ptr++)

在执行语句之后,后增量作为副作用进行排序。操作数的值是语句的结果。所以,它等价于

 int b = (*a_ptr = 3);
 a_ptr++;

也就是说,一般来说,操作数是运算符操作或工作的表达式或值。所以可以

  • 一个变量(例如:var,如int var
  • 文字(5 或 '"Hello"')
  • 一个表达式(如 *a_ptr++