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 ++;的影响是什么?
打印之前,您正在增加x
- 所以这就是输出为101
的原因。
你做相同的动作x = x; x++;
但'x ++;'会做同样的事情。或者是'x = x ++;'与x ++相同; x = x;'? – John 2013-05-14 16:28:01
@John它更像是另一种方式 - 'x = x; x ++;' - 在这种情况下,分配基本上被“扔掉”。 – 2013-05-14 16:31:25
清除..谢谢大家 – 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;
}
但在Java中,此程序的输出为100.值在增量前分配。但为什么这里改变? – 2013-05-14 16:29:06
@ThisaraRanawaka C不是Java--这里有不同的规则。 – 2013-05-14 16:29:53
@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。
不应该以相反的方式行吗?后增量优先于赋值? – John 2013-05-14 16:34:14
@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 ...
这是正在发生的事情
#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++
是这样工作的:
- 取值的参考。
- 分配一个新的整数并将其存储到其中。
- 增加参考。
- 返回临时整数。
在C++中是这样的:
int PostIncrement(int& x)
{
int y = x;
x = x + 1;
return y;
}
的运算符优先级不以这种方式丢失,而且分配增量之后进行。
操作顺序无法保证。 6.2.5/3:“操作符和操作数的分组由语法来表示。”除了后面指定的以外,子表达式的副作用和值计算是不确定的。“86)”赋值是可能的在增量之前进行排序;增量后还可以对作业进行排序。结果将因编译器而异(或者针对具有不同优化设置的相同编译器)。 – 2013-05-14 19:12:21
@JohnBode这是正确的。在最常用的实现中,顺序如我所描述的那样。 – 2013-05-14 19:17:40
int&x是C中的语法错误。 – 2013-05-14 19:34:43
这种味道像未定义的行为。 – John 2013-05-14 16:26:31
它应该是101,你错了 – SpacedMonkey 2013-05-14 16:28:06
我希望所有的问题都有很多答案:) – maverik 2013-05-14 16:30:05