C++ 递增和递减运算符

C++ 递增和递减运算符,c++,C++,如图所示,以下内容的有效性和无效性如何?它们是什么意思。什么时候会出现这种情况来编写这段代码 ++x = 5; // legal --x = 5; // legal x++ = 5; // illegal x-- = 5; // illegal 后缀(x++/x--)运算符不返回左值(可以分配给的值) 它们返回一个临时值,该值是更改前变量值的副本 该值是一个右值,因此您可以写入: y=x++并获取x的旧值这些都会在序列点之间多次修改x的值,因此是未定义的行为,您

如图所示,以下内容的有效性和无效性如何?它们是什么意思。什么时候会出现这种情况来编写这段代码

++x = 5;     // legal
--x = 5;     // legal
x++ = 5;     // illegal
x-- = 5;     // illegal
后缀(x++/x--)运算符不返回左值(可以分配给的值)

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

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


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

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

假设问题是关于内置的
++
-
操作员,这些声明都不是严格合法的

前两个是格式良好的,即它们仅仅是可编译的,因为前缀增量的结果是左值。最后两个是格式错误的,因为后缀增量的结果不是右值,这就是为什么不能为其赋值


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

考虑到运算符=()和运算符++()都可以重载,如果不了解运算符所应用的类型,就不可能说出代码的作用。

坦率地说,您永远不应该编写这样的代码。增量后和增量前(和减量)只能单独使用。它们只是造成混乱的方法。

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

++x
--x
这两种都将
x
返回给您(在递增/递减之后)。在这一点上,您可以用它做任何您想做的事情,包括为它指定一个新值

x++
x--
这两个都会返回
x
的值(就在它递增/递减之前)。更改此值并不比更改任何普通函数的返回值更有意义:

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

作业可能重复?考题?不是两个都有。我只是想知道。虽然这段代码可以编译,但这不是一个好主意。目前还不清楚代码试图做什么,并且很容易将其分成两个简单、清晰的语句。这是一种“聪明”的编码,以后会让你困扰。@Kirill-这不是它的复制品。OP问为什么前两个编译,后两个不编译,而你的副本问为什么前两个是未定义的行为。好奇为什么这被否决了-这个人有一个正确的观点。我希望OP处理的是整数,但没有提到类型。我相信,如果x是非标量类型,这甚至可能不会导致未定义的行为。@DeadMG:人们在没有想到它们或认为它们太“花哨”或“迂腐”时会对它们投反对票。我没有投反对票,但可能是因为这更多的是一个评论,而不是一个答案。如果你只单独使用它们,那么post increment是一个毫无价值的操作符。我想当DeadMG说“自己”时,他的意思是不要做双重赋值。他不是想排除像if(x++){/*…*/}之类的东西,对吧,DeadMG?我绝对是想排除这些。后增量和前增量是语法上的糖分,在表达式中实际使用时并不好。如果您非常需要它,请手动执行,让编译器将其转换为另一种形式。但我不知道在什么情况下你会需要它。@Bruno:为什么不呢?这就是“增量后”操作符的整个点。