2010-05-06 83 views
6

如何显示下面的有效和无效以及它们是什么意思。写这段代码的时候会出现这种情况。递增和递减操作符

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

http://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior – 2010-05-06 17:53:58

+1

作业的可能重复?考题? – 2010-05-06 17:56:09

+0

不是他们俩。只是好奇知道。 – ckv 2010-05-06 17:58:17

回答

13

后缀(x ++/x--)运算符不会返回一个左值(您可以赋值的值)。

他们返回一个临时值,它是变化

值是右值之前的变量值的副本,所以你可以写:

y = x++,并得到X

的旧值
+0

你应该添加那些永远不会被使用的代码。 – 2010-05-06 18:58:26

+2

@布鲁诺:为什么不呢?这是后增量运营商的整个观点。 – 2010-05-06 19:01:42

7

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

5

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

前两个是形成良好,即它们仅仅编译因为前缀增量的结果是左值。最后两个是不合格,因为后缀增量的结果不是一个右值,这就是为什么你不能分配给它。

但是,即使是前两个也不合法,因为它们会产生未定义的行为。如果没有中间顺序点修改同一对象是非法的。 (还要注意的是,编译器可以拒绝编译生成未定义行为的格式良好的代码,这意味着即使是第一对也可能是不可编译的)。

9

鉴于运算符=()和运算符++()都可以被重载,所以在不知道更多关于运算符被应用到的事物类型的情况下,代码的作用是不可能的。

+1

好奇为什么这是downvoted - 该男子有一个有效的观点。我期望OP在处理整数,但没有提及类型。 – Puppy 2010-05-06 18:03:48

+0

我相信,如果x是非标量类型,这可能不会导致未定义的行为。 – 2010-05-06 18:14:50

+0

@DeadMG:当人们没有想到他们,或认为他们太“看中”或“迂腐”时,他们就会冷静下来。 – 2010-05-06 18:19:48

1

坦率地说,你不应该写这个。后增量和前增量(和减量)应该只能自己使用。他们只是混淆的食谱。

+2

如果你只用它们自己,那么后增量是一个毫无价值的运营商。 – 2010-05-06 18:08:01

+0

我认为,当DeadMG说“在他们自己的”他的意思是不做双重任务。他不是故意排除诸如“if(x ++){/*...*/}”之类的东西。Right,DeadMG? – 2010-05-06 18:15:59

+0

我绝对的意思是排除这些。后增量和预增量是语法糖,实际用于表达式时效果不佳。如果你迫切需要这个,手动完成,让编译器把它变成另一种形式。但是我不知道你有什么可能需要它的情况。 – Puppy 2010-05-06 22:06:28

1

我能想到的唯一的地方会出现这种情况是操作符++和operator =的操作符重载。即便如此,定义并不明确。你的代码基本上是给x添加一个,然后给它赋值5。会出现一个问题,比如为什么你需要在分配5之前增加x?唯一可能的解释是如果你有某种类的++操作符以某种方式递增内部计数器,然后赋值。不知道为什么需要这样的事情。

2

++x--x给你回x(它被递增后/递减)。在这一点上,你可以做它想要的,包括分配一个新的值。

x++x--给你回什么x(它只是增加之前 /递减)。改变这个值是没有比改变任何普通函数的返回值更有意义:

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