i=3;l=(++i)+(++i)+(++i);结果l=16,为什么

时间:2021-06-28 09:11:04
void main()
{
int i;
int j,k,l,m;

i=3;
j=(++i);
i=3;
k=(++i)+(++i);
i=3;
l=(++i)+(++i)+(++i);
i=3;
m=(++i)+(++i)+(++i)+(++i);
}
结果:j=4,k=10,l=16,m=23
希望能解释为什么是这4个数
(vc++6.0,没有include,数据从debug状态读出,没有调整过编译器(默认))

7 个解决方案

#1


换本好点的教材吧,别在日经贴的++问题上浪费生命啦。

#2


引用 1 楼 taodm 的回复:
换本好点的教材吧,别在日经贴的++问题上浪费生命啦。


对头!貌似某些大学的研究生面试题目竟然考这个。还有人煞有介事的对此问题深入分析。

#3


唔……我不是要考试啊……也不是面试什么的……只是今天写到++然后不确定i++和++i然后查了一下然后看到一个类似的问题然后好奇蛋疼……然后就有这个问题了……是编译器的问题么?

#4


前置++在每步的运算前先自己加

x= a+a+a;
实际上是2步
即 x=a+a;
x= x+a

所以你把题目给的算式拆开分析即可

#5


引用 3 楼 zhailingzy 的回复:
唔……我不是要考试啊……也不是面试什么的……只是今天写到++然后不确定i++和++i然后查了一下然后看到一个类似的问题然后好奇蛋疼……然后就有这个问题了……是编译器的问题么?

确实是

#6



引用 4 楼 azraeln 的回复:
x= a+a+a;
实际上是2步
即 x=a+a;
x= x+a

所以你把题目给的算式拆开分析即可

Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the sub-expressions of a full expression; otherwise the behavior is undefined.
看起来是这个东西……那可以结贴了……
at most once……

#7


你换个编译器还可能是
4 10 18 28呢
你只要知道++i返回+后的i,和+左右先计算哪个不一定,并且在编程上不用这种风格。就可以了,置于编译器什么时候取这个++返回的i值,说不清...

#1


换本好点的教材吧,别在日经贴的++问题上浪费生命啦。

#2


引用 1 楼 taodm 的回复:
换本好点的教材吧,别在日经贴的++问题上浪费生命啦。


对头!貌似某些大学的研究生面试题目竟然考这个。还有人煞有介事的对此问题深入分析。

#3


唔……我不是要考试啊……也不是面试什么的……只是今天写到++然后不确定i++和++i然后查了一下然后看到一个类似的问题然后好奇蛋疼……然后就有这个问题了……是编译器的问题么?

#4


前置++在每步的运算前先自己加

x= a+a+a;
实际上是2步
即 x=a+a;
x= x+a

所以你把题目给的算式拆开分析即可

#5


引用 3 楼 zhailingzy 的回复:
唔……我不是要考试啊……也不是面试什么的……只是今天写到++然后不确定i++和++i然后查了一下然后看到一个类似的问题然后好奇蛋疼……然后就有这个问题了……是编译器的问题么?

确实是

#6



引用 4 楼 azraeln 的回复:
x= a+a+a;
实际上是2步
即 x=a+a;
x= x+a

所以你把题目给的算式拆开分析即可

Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the sub-expressions of a full expression; otherwise the behavior is undefined.
看起来是这个东西……那可以结贴了……
at most once……

#7


你换个编译器还可能是
4 10 18 28呢
你只要知道++i返回+后的i,和+左右先计算哪个不一定,并且在编程上不用这种风格。就可以了,置于编译器什么时候取这个++返回的i值,说不清...