分配给后缀递增的指针
Assigning to postfix-incremented pointers
我读过操作数的后缀递增和递减运算符 return rvalues。假设这是真的,这样的代码怎么可能?:
int arr[5]{};
int *p = arr;
for (int i = 0; i != 5; ++i)
*p++ = i;
我的思路是
- 根据运算符优先级,
*p
将首先计算。
- 然后后缀增量将增加值和return 对象的副本作为右值。
- 然后我感到困惑,因为右值不应该在赋值运算符的左侧......
所以我的问题基本上是:
*p++ = i;
怎么可能?
According to operator precendence, *p
will get evaluated first.
你错了。根据documentation,先计算增量。这将产生一个右值(即指针在递增之前的值),然后在它被取消引用后,它是一个 lvalue 你可以分配给。
According to operator precendence, *p will get evaluated first.
错了。
这里:
*p++
首先计算增量,而不是 *p
。
这给出了一个右值(指针的值),在取消引用之后,它变成了一个左值,您可以将其分配给 i
。
您可以将 for 循环重写为:
for (int i = 0; i != 5; ++i) {
std::cout << *p << std::endl;
*p++ = i;
std::cout << *p << std::endl;
}
获得更好的视野。
我读过操作数的后缀递增和递减运算符 return rvalues。假设这是真的,这样的代码怎么可能?:
int arr[5]{};
int *p = arr;
for (int i = 0; i != 5; ++i)
*p++ = i;
我的思路是
- 根据运算符优先级,
*p
将首先计算。 - 然后后缀增量将增加值和return 对象的副本作为右值。
- 然后我感到困惑,因为右值不应该在赋值运算符的左侧......
所以我的问题基本上是:
*p++ = i;
怎么可能?
According to operator precendence,
*p
will get evaluated first.
你错了。根据documentation,先计算增量。这将产生一个右值(即指针在递增之前的值),然后在它被取消引用后,它是一个 lvalue 你可以分配给。
According to operator precendence, *p will get evaluated first.
错了。
这里:
*p++
首先计算增量,而不是 *p
。
这给出了一个右值(指针的值),在取消引用之后,它变成了一个左值,您可以将其分配给 i
。
您可以将 for 循环重写为:
for (int i = 0; i != 5; ++i) {
std::cout << *p << std::endl;
*p++ = i;
std::cout << *p << std::endl;
}
获得更好的视野。