首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Func3的隐藏岩石(func1(),func2())?

Func3的隐藏岩石(func1(),func2())?
EN

Stack Overflow用户
提问于 2021-09-27 08:28:12
回答 2查看 76关注 0票数 1

在C中使用另一个函数调用作为函数参数有问题吗?

代码语言:javascript
复制
int foo1(int a){/*does something */ return a;}
int foo2(int b){/*does something */ return b;}
int foo3(int a, int b){return a+b;} 

int result = foo3(foo1(1),foo2(2)); /*result is 3 */
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-27 08:45:31

扩展tstanisl的评论

代码语言:javascript
复制
int foo1(int a) { puts("ONE"); return a++; }
int foo2(int b) { puts("TWO"); return b++; }
int foo3(int a, int b) { return a+b; } 

int result = foo3(foo1(1),foo2(2));

指纹没有具体的定单。任一种

代码语言:javascript
复制
ONE                                     TWO
TWO                                     ONE

是有可能的。甚至可以在下次重新编译(或运行)可执行文件时进行更改!

票数 3
EN

Stack Overflow用户

发布于 2021-09-27 08:38:33

你问题中的代码没有问题。

这段代码看起来非常像是为了演示像foo3(foo1(1),foo2(2))这样的调用的潜在问题,但是它没有做到这一点。

例如:

代码语言:javascript
复制
int foo1(int a){return a++;}

表达式a++有一个副作用,但它与此无关。参数a是一个局部变量,当函数返回时它就不再存在了。它也可能只是return a; (除了增量溢出时可能出现的未定义行为)。

这是:

代码语言:javascript
复制
int n = 42;
int func(int param) { return param++; }

返回值42,不影响n的值。++适用于n的副本,而不是n本身。C中的函数参数是通过值传递的。

这种调用的潜在问题是,参数的计算顺序不明确。调用foo1(1)foo2(2)没有对调用方可见的副作用,但是像foo3(a++, a++)这样的调用会产生不同的结果,这取决于计算参数的未指定顺序。(我不能百分之百确定这种情况是否有未定义的行为;这取决于参数的计算之间是否存在顺序点。但是,仅仅是这种不确定性就足以避免编写这样的代码。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69343430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档