2014-01-15 31 views
1

只是解释为什么发生这种情况在第2行:为什么变量在相同语句中增加后返回先前的值?

int i=5; 
printf(" Before %d then operated %d and after %d", i, ++i, i); // Before 6 then operated 6 and after 5 
printf("\n And now %d", i); //And now 6 

据我所学到的,结果应该是前5然后运行6和6后,我无法得到解释从谁我正在学习..我是一个新手到C

在Borland的C++ 5和代码块测试...

+0

可能重复[?为什么这些结构未定义行为(http://stackoverflow.com/questions/949433/why-are-these-constructs- undefined-behavior) – haccks

+0

@haack这绝对不是该帖子的重复。 OP不会修改单个序列点中的相同变量。 –

+1

@haccks可以找到一种方法来搜索任何人之前发布的这个问题,因为我不知道如何描述它,除非显示...谢谢 –

回答

4

函数参数的评估顺序未指定,由参数类型,被调用函数的calling convention,优化,体系结构和编译器决定。

从C99标准:

6.5.2.2函数调用的实际参数内

功能标志的评估顺序,实际 参数,子表达式是 不明,但实际呼叫之前有一个序列点。


我想补充一些经验(从here借来的)。
以下代码:

int i=1; 
printf("%d %d %d\n", i++, i++, i); 

导致

2 1 3 - 上Linux.i686
2 1 3使用SunStudio C++ 5.9 - - 对Linux.i686
1 2 3使用克++ 4.2.1使用克++ 4.2。 1 on SunOS.x86pc
1 2 3 - 在SunOS.x86pc上使用SunStudio C++ 5.9
1 2 3 - 在SunOS上使用g ++ 4.2.1 .sun4u
1 2 3 - 使用SunStudio C对SunOS.sun4u ++ 5.9

+1

它也可能取决于优化。 –

+0

@ShafikYaghmour更新。谢谢。 – herohuyongtao

+1

试图说明订单是由什么决定的并不真正有帮助。编译器编写者有理由选择*任何命令*,任何原因*。编译器编写者可以决定订单是否基于月球的相位。重要的一点是订单是不知道的,因此你不应该编写依赖于你知道它的代码。 –

1

你可能认为,在printf评估顺序是从左到右。 这是错的!

函数参数的评估顺序未指定。

在您的特定示例中,似乎顺序是从右到左。

+0

未指定*函数*参数的评估顺序。 –

+0

@Andrey纠正我编辑 – laaposto

相关问题