Postfix(前缀)增量,L值和R值(在C和C 中)

postfix (prefix) increment, L-value and R-value (in C and C++)

本文关键字:前缀 增量 Postfix 值和      更新时间:2023-10-16

我刚刚学会了以下事实:

  • 前缀增量( var_name)的结果是C中的R值(至少,我是 当然,它不是C)中的L值,而是C 中的L值。

  • 后缀增量(var_name )的结果是C中的R值(至少,我是 当然,它不是c)中的L值。在C 中也是如此(它说结果 是一个prvalue)。

我在VS2010(.CPP和.C)和Ubuntu(GCC和G )中检查了这些。

在C 标准的第109(5.3.2)章中

前缀 的操作数是通过添加1来修改的,或者如果是bool的,则将其设置为true(此用途已弃用)。这 操作数应为可修改的LVALUE。操作数的类型应为算术类型或指向 完全定义的对象类型。结果是更新的操作数;这是一个lvalue ,并且...

和p.101,(5.2.6)

后缀 表达式的值是其操作数的值。... 结果是 prvalue 。结果的类型是操作数类型的CV UNQUALIFIED版本。另请参见5.7和5.17。

(我不知道R值和Prvalue之间的区别)。

对于C标准http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,前缀 在6.5.3.1中描述,后缀为6.5.2.4,但是从描述中,我无法得到明确,确定的答案。

我想知道使它们成为R值或L值的原因。我只知道

We can assign a value to a (modifiable) L-value, for example, a variable name. R-value is a value of an expression.

,但我不知道为什么Postfix 不是C和C 中的L值,以及为什么前缀 不在C。中(我看到了类似" Postfix之类的东西) ...存储...在临时地址中,然后...",但我仍然不明白)。

另一个问题是为什么前缀 在C和C 中有所不同?使前缀 成为L值(在C 中)有许多优点吗?如果是这样,为什么C不更改此?(除了向后兼容以外的其他原因,或者至少为什么更改会引起很多问题)。

c和c 是不同的语言。C 具有运算符的过载,C没有。运算符,无论前缀还是后缀,都是运算符,可以在C 中重载。C 也有参考文献,C也没有。

在C, I i 中都产生一个不是 lvalue 的值。这是可取的,否则您可以通过尝试在相同的序列点上修改相同标量来以不确定的行为进行操作。

思考的食物:在C中,逗号操作员还产生一个不是lvalue的值,因此要"删除" lvalueness ,您可以做:

(0, lvalue)

的确

是真的
  • pre增量/减少操作员( var或-var)产生lvalue(即修改对象)

  • 发布增量/减少操作员(var 或var--)产生一个rvalue(即临时对象)。

考虑以前增量/减少操作员

以下代码
{
int i = 0;
int* pi = &(++i);
}

还可以,因为实际上其伪代码是

i = i+1; // pre increment i
int* pi = &i; // then evaluate its address and assign it to pi 

现在考虑相同的代码,但是使用后增量/减少操作员以及如果编译器接受此无效代码

的后果
{
int i = 0;
int* pi = &(i++); // Not OK !! because it is a temporary variable
}

其伪代码将为

int i = 0;
int tmp = i; // compiler creates a temporary variable to save value of i
int* pi = &tmp; // then would take the address of a temporary variable 
i = i + 1;