x = x ++;的影响是什么?

问题描述:

#include <stdio.h> 

int main() 
{ 
    int x=100; 
    x=x++; 
    printf("x : %d\n",x); //prints 101 
    return 0; 
} 

输出101的原因是什么?我认为输出应该是100.x = x ++;的影响是什么?

+2

这种味道像未定义的行为。 – John 2013-05-14 16:26:31

+0

它应该是101,你错了 – SpacedMonkey 2013-05-14 16:28:06

+1

我希望所有的问题都有很多答案:) – maverik 2013-05-14 16:30:05

打印之前,您正在增加x - 所以这就是输出为101的原因。

你做相同的动作x = x; x++;

+1

但'x ++;'会做同样的事情。或者是'x = x ++;'与x ++相同; x = x;'? – John 2013-05-14 16:28:01

+0

@John它更像是另一种方式 - 'x = x; x ++;' - 在这种情况下,分配基本上被“扔掉”。 – 2013-05-14 16:31:25

+0

清除..谢谢大家 – 2013-05-14 16:35:49

这里是什么,我相信你正在寻找:

int main(){ 
    int x=100; 
    printf("x : %d\n",x++); // Will print 100 and then increment x 
    return 0; 
} 
+0

但在Java中,此程序的输出为100.值在增量前分配。但为什么这里改变? – 2013-05-14 16:29:06

+0

@ThisaraRanawaka C不是Java--这里有不同的规则。 – 2013-05-14 16:29:53

+0

@Reed - 那么这里的“规则”是什么?为什么*不是这个UB? – Roddy 2013-05-14 16:38:32

你它有效地分配给x,后递增x

x=x++实际上变成(assign x to x prior to increment) then (increment x)

这是去,如果你是给予同样的效果写道:

x = x; 
++x; // Increment after the assignment 

这应该在x=x++;行之后留出x作为101。

+0

不应该以相反的方式行吗?后增量优先于赋值? – John 2013-05-14 16:34:14

+0

@John是的......但是这个值是在增加的值被设置之前返回的(因此**后** - 增量),所以分配发生在增量之前。 – 2013-05-14 16:35:37

您正在增加您正在打印的相同x - 这里无论是后增量还是预增量都无关紧要。

x=x++将产生与x=++x相同的结果。

如果你想为它分配另一个对象做到这一点:

#include<stdio.h> 

int main(){ 
     int x=100; 
     int y=x++; 
     printf("y : %d\n",y); //prints 100 
     printf("x : %d\n",x); //prints 101 
     return 0; 
} 

这是Undefined Behaviour,由于Sequence Points

连续的“序列点”之间的对象的值可以用表达式

先前epxression x=100;的端部被 改性只有一次是一个顺序点,和x=x++;到底是另一个。

基本上,你的表达式没有中间的'序列点',但你要修改X的值两次。这样做的结果是未定义行为:基本上,什么可能发生:你可以得到100,101或42 ...

+0

我认为你是对的?我怀疑它,但没有调查。 http://*.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-i-etc – John 2013-05-14 16:49:23

+0

@约翰 - 谢谢。我将这个问题标记为重复。 – Roddy 2013-05-14 16:52:24

这是正在发生的事情

#include <stdio.h> 

int main() 
{ 
    int x=100; 
    x=x++; // This is original code however I have rewritten this as below 
    x=x; 
    x++; 
    printf("x : %d\n",x); //prints 101 
    return 0; 
} 

,你可以看到

x=x++; 

可以改写为

x=x; 
x++; 

HENC e结果没有意外...

结果是x的值不会改变。

x++是这样工作的:

  1. 取值的参考。
  2. 分配一个新的整数并将其存储到其中。
  3. 增加参考。
  4. 返回临时整数。

在C++中是这样的:

int PostIncrement(int& x) 
{ 
    int y = x; 
    x = x + 1; 
    return y; 
} 

的运算符优先级不以这种方式丢失,而且分配增量之后进行。

+1

操作顺序无法保证。 6.2.5/3:“操作符和操作数的分组由语法来表示。”除了后面指定的以外,子表达式的副作用和值计算是不确定的。“86)”赋值是可能的在增量之前进行排序;增量后还可以对作业进行排序。结果将因编译器而异(或者针对具有不同优化设置的相同编译器)。 – 2013-05-14 19:12:21

+0

@JohnBode这是正确的。在最常用的实现中,顺序如我所描述的那样。 – 2013-05-14 19:17:40

+0

int&x是C中的语法错误。 – 2013-05-14 19:34:43