【问题标题】:Why assignment operator = doesn't return the value of pointer but the dereference value?为什么赋值运算符 = 不返回指针的值而是解引用值?
【发布时间】:2020-12-29 12:22:19
【问题描述】:

来自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。

【问题讨论】:

  • 操作数是你给操作员的任何“参数”。不必是标识符或名称 - 3 两者都不是,但您仍然可以毫无问题地将其用作操作数。
  • 你为什么用 C 标记这个?这是 C++ 代码。

标签: c++


【解决方案1】:

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的表达式,它被分配给b。

【讨论】:

  • 最好也提及运算符优先级。
  • @Jarvis:运算符优先级从语言语法中退出。因此,它不是一个基本概念。我更喜欢用分组来说话。也就是说,请随意提出自己的答案。
【解决方案2】:

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

*(a_ptr++)

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 2020-04-01
    • 2013-02-27
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多