Postfix(前缀)增量,L值和R值(在C和C 中)
postfix (prefix) increment, L-value and R-value (in C and C++)
我刚刚学会了以下事实:
前缀增量( 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;
- 增量运算符与后缀混淆
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 此增量后语句是否会导致未定义的行为?
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 查找带有 Anaconda cmake 前缀的 boost-python3
- 迭代器类的重载前缀增量运算符会引发分段错误
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 生成前缀位掩码
- 导致错误的后缀和前缀增量
- 为什么后缀增量比C 中的前缀更快
- C++如何知道在重载运算符时增量++是前缀或后缀
- Postfix(前缀)增量,L值和R值(在C和C 中)
- GCC 前缀增量运算符在将值传递给函数时行为异常
- C++前缀增量运算符返回左值这一事实的实际用法
- 如何在表达式中计算后缀和前缀增量运算符
- stl 迭代器的后缀和前缀增量之间的差异
- 在类计时器中重载前缀和后缀增量.调试时出现的问题
- C++预处理器中的前缀增量