增量和减量运算符

时间:2010-05-06 17:50:01

标签: c++

以下有效和无效如何显示以及它们的含义。什么时候会出现这样的情况来编写这段代码。

++x = 5;     // legal
--x = 5;     // legal
x++ = 5;     // illegal
x-- = 5;     // illegal

7 个答案:

答案 0 :(得分:13)

postfix(x ++ / x--)运算符不返回左值(可以赋值的值)。

它们返回一个临时值,它是变更之前变量值的副本

该值是右值,因此您可以写:

y = x++并获取x的旧值

答案 1 :(得分:9)

鉴于operator =()和operator ++()都可以重载,如果不了解运算符应用的类型,就无法说出代码的作用。

答案 2 :(得分:7)

这些都会在序列点之间多次修改x的值,因此是未定义的行为,您应该小心避免。我不知道“合法”和“非法”之间的区别在哪里 - 因为行为是合法的,任何行为(包括向国务卿发送各种电子邮件)完全符合标准。

答案 3 :(得分:5)

假设问题是关于内置++--运算符,则这些语句都不是严格合法的。

前两个是格式良好的,即它们只是可编译,因为前缀增量的结果是左值。最后两个是格式错误的,因为后缀增量的结果不是右值,这就是你无法分配它的原因。

然而,即使前两个在某种意义上也不合法,它们会产生不确定的行为。在没有插入序列点的情况下多次修改同一对象是非法的。 (另请注意,允许编译器拒绝编译生成未定义行为的格式良好的代码,这意味着即使第一对代码也可能被证明是不可编译的。)

答案 4 :(得分:2)

++x--x 都会返回x (在递增/递减之后)。此时,您可以使用它执行所需操作,包括为其指定新值。

x++x--两者都会回复x 的内容(之前增加/减少)。改变这个值没有比改变任何普通函数的返回值更有意义了:

obj->getValue() += 3; // pointless

答案 5 :(得分:1)

坦率地说,你永远不应该这样写。后增量和预增量(和减量)应该只能单独使用。它们只是混乱的食谱。

答案 6 :(得分:1)

我能想到的唯一可能出现这种情况的地方是运算符重载运算符++和operator =。即使这样,定义也不清楚。您编码的内容基本上是将一个添加到x,然后为其分配5。会出现一个问题,例如为什么在为其分配5之前需要增加x?唯一可能的解释是,如果你有某种类,其中++运算符以某种方式递增内部计数器,然后是赋值。不知道为什么需要这样的东西。