函数调用序列(C)
发布时间:2020-12-16 10:35:09 所属栏目:百科 来源:网络整理
导读:result= function_1()*function_2(); 我正在写一个像上面这样的代码.我想知道的是在进行乘法时,首先调用哪个函数?这是因为,第一个被调用的函数可以影响从另一个函数返回的结果.我假设首先调用function_1(),当我尝试时,我看到它确实如此.但是,总是如此吗?是
result= function_1()*function_2(); 我正在写一个像上面这样的代码.我想知道的是在进行乘法时,首先调用哪个函数?这是因为,第一个被调用的函数可以影响从另一个函数返回的结果.我假设首先调用function_1(),当我尝试时,我看到它确实如此.但是,总是如此吗?是否取决于我使用的编译器或我使用的系统? 解决方法
C(或C)标准未指定评估顺序(见
answer from Vlad).如果你的function_1或function_2有重要的
side-effects,它可能会变成你应该绝对避免的某些
unspecified behavior(就像你应该避免
undefined behavior).在某些情况下(具有强大优化功能的内联函数),计算可能会混杂在一起.
想想像奇怪的情况 static int i; int function_1(void) { i++; return i; } int function_2(void) { i+=2; return 3*i+1; } 它可能是特定于实现的,可能取决于实际的编译器和optimization标志. 您应该编写代码,好像函数调用的顺序是完全随机的并且不可重现(即使在实践中它可能是可重现的).同样,您不应该期望任何特定的参数评估顺序(例如,在f(i,j)中您不知道i或j是否已经先递增),即使对于给定的编译器,该订单可能是固定的.同样,您应该想象一个完全随机且不可重现的顺序. 如David Schwartz所述,如果您关心订单,则应该明确编写一些sequence points 最后,如果您的代码依赖于某些顺序,则它完全不可读,并且出于简单的可读性原因,您应该避免以这种方式编码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |