2014-10-12 64 views
0

我已阅读函数参数中的表达式求值顺序,二元运算符在C中未定义。这是什么意思,什么时候该注意?何时评价顺序重要

+2

可能重复的[解释在printf的评价;的顺序](http://stackoverflow.com/questions/12960241/explain-the -order-of-evalution-in-printf) – 2501 2014-10-12 12:12:24

+2

[C函数调用之前的参数评估顺序]的可能重复(http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function -calling-in-c) – WhozCraig 2014-10-12 12:13:30

+0

你知道什么“* [an] expression [s] *”的评估意味着/是什么? – alk 2014-10-12 12:18:49

回答

3

只是不依赖于它。如果你有这样的代码:

func(a(), b(), c()); 

随后的a()b()c()执行顺序不应该的问题为你的程序的正确性。如果确实如此(例如,如果a()打开一个资源,并且c()关闭它),那么这里有危险。

最简单的解决方法是写出这样的代码是这样的:的

int a_result = a(); 
int b_result = b(); 
int c_result = c(); 
func(a_result, b_result, c_result); 
1

下面是一个简单的例子:

SomeCall(Writefile(handle) , Closefile(handle)) ; 

在什么样的顺序的两个函数被调用没有规定,你可以关闭该文件之前,你甚至可以写进去,即使调用的顺序逻辑上显示正确。

+0

它为什么“逻辑上显示正确”?在我看来,你正在做的事情,应该没有秩序,即不正确的命令。 – 2014-10-12 12:43:00

+0

@KerrekSB因为我们从左到右,往下看。例如,代码也可以分成不同的行。记住OP不是C专家,逻辑确实起到了作用。 – 2501 2014-10-12 12:43:29