加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

函数调用序列(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

最后,如果您的代码依赖于某些顺序,则它完全不可读,并且出于简单的可读性原因,您应该避免以这种方式编码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读