以下有效和无效如何显示以及它们的含义。什么时候会出现这样的情况来编写这段代码。
++x = 5; // legal
--x = 5; // legal
x++ = 5; // illegal
x-- = 5; // illegal
答案 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?唯一可能的解释是,如果你有某种类,其中++运算符以某种方式递增内部计数器,然后是赋值。不知道为什么需要这样的东西。