我刚刚了解到以下事实:
我在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不改变这个呢?(除了向后兼容性以外的其他原因,或者至少为什么更改它会导致许多问题)。
发布于 2014-08-15 00:43:45
C和C++是不同的语言。C++有操作符重载,而C没有。++运算符,无论是前缀还是后缀,都是可以在C++中重载的运算符。C++也有引用,而C没有。
在C中,++i和i++都生成一个不是l值的值。这是可取的,因为否则您可能会与未定义的行为发生冲突,方法是在相同的序列点边界内修改相同的标量。
思考:在C中,逗号操作符也生成一个不是lvalue的值,因此要“丢弃”lvalue,您可以这样做:
(0, lvalue)发布于 2017-07-04 12:00:40
的确,
考虑以下带有预增量/递减运算符的代码
{
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; https://stackoverflow.com/questions/21351799
复制相似问题