来自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
。
答案 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++
)