在研究Can you have a incrementor and a decrementor on the same variable in the same statement in c
时我发现你可以在一个变量上有几个前缀增量/减量运算符,但只有一个后缀
例如:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
为什么会这样?
答案 0 :(得分:9)
这是因为在C ++(但不是C)中,++x
的结果是lValue,这意味着它是可分配的,因此可以链接。
但是,x++
的结果不是lValue,而是prValue,这意味着它无法分配,因此无法链接。
答案 1 :(得分:6)
在C ++语言中,前缀增量/减量运算符返回 lvalues ,而后缀值返回 rvalues 。同时,所有修改运算符都需要左值参数。这意味着前缀增量/减量的结果可以传递给需要左值参数的任何其他附加运算符(包括额外的增量/减量)。
出于与C ++相同的原因,你可以编写像这样的代码
int i = 0;
int *p = &++i;
将增加i
并使p
指向i
。一元&
需要左值操作数,这就是为什么它可以使用前缀++
的结果(但不能使用后缀一个)。
应用于同一对象的具有多个内置前缀增量/减量的表达式会产生未定义的行为,但它们仍然是格式良好的(即“可编译”)。
++foo--
之类的表达式无效,因为在C ++中,后缀运算符的优先级高于前缀1。大括号可以改变这一点。例如,(++foo)--
是一个格式良好的表达式,虽然会再次导致未定义的行为。