首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后缀(前缀)增量、L值和R值(以C和C++表示)

后缀(前缀)增量、L值和R值(以C和C++表示)
EN

Stack Overflow用户
提问于 2014-01-25 14:30:29
回答 2查看 3.3K关注 0票数 5

我刚刚了解到以下事实:

  • 前缀增量(++var_name)的结果是C中的R-值(至少在C中它不是L-值),但它是C++中的L-值。
  • 后缀增量(var_name++)的结果是C中的R值(至少,我确信它不是C中的L值)。这在C++中也是正确的(它说结果是prvalue)。

我在VS2010 (.cpp和.c)和Ubuntu (gcc和g++)上查过。

在C++标准http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf第109 (5.3.2)页中,它被写成

前缀++的操作数是通过添加1来修改的,如果前缀是bool,则将其设置为true (不推荐这种用法)。操作数应为可修改的lvalue。操作数的类型应该是算术类型或指向完全定义的对象类型的指针。结果是更新的操作数;它是一个lvalue__,并且.

和第101页(5.2.6)

后缀++表达式的值是其操作数的值。.结果是prvalue。结果的类型是操作数类型的cv非限定版本。另见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.

,但我不知道为什么后缀++在C和C++中不是L值,为什么前缀++不在C.中(我看到了类似于“后缀++...store...in临时地址,那么.”之类的东西,但我还是不明白)。

另一个问题是,为什么前缀++在C和C++中是不同的?使前缀++成为L值(在C++中)有许多优点吗?如果是的话,为什么C不改变这个呢?(除了向后兼容性以外的其他原因,或者至少为什么更改它会导致许多问题)。

EN

回答 2

Stack Overflow用户

发布于 2014-08-15 00:43:45

C和C++是不同的语言。C++有操作符重载,而C没有。++运算符,无论是前缀还是后缀,都是可以在C++中重载的运算符。C++也有引用,而C没有。

在C中,++ii++都生成一个不是l值的值。这是可取的,因为否则您可能会与未定义的行为发生冲突,方法是在相同的序列点边界内修改相同的标量。

思考:在C中,逗号操作符也生成一个不是lvalue的值,因此要“丢弃”lvalue,您可以这样做:

代码语言:javascript
复制
(0, lvalue)
票数 1
EN

Stack Overflow用户

发布于 2017-07-04 12:00:40

的确,

  • 预增量/递减运算符(++var或-var)产生一个lvalue (即可修改的对象)。

  • 后置增量/递减运算符(var++或var--)产生一个rvalue (即临时对象)。

考虑以下带有预增量/递减运算符的代码

代码语言:javascript
复制
{

int i = 0;

int* pi = &(++i);

}

没关系,因为实际上它的伪代码是

代码语言:javascript
复制
i = i+1; // pre increment i

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

现在,考虑相同的代码,但使用后置增量/递减运算符,以及如果编译器接受此无效代码的后果。

代码语言:javascript
复制
{

int i = 0;

int* pi = &(i++); // Not OK !! because it is a temporary variable

}

它的伪代码是

代码语言:javascript
复制
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; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21351799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档