在C中使用另一个函数调用作为函数参数有问题吗?
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 */发布于 2021-09-27 08:45:31
扩展tstanisl的评论
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));指纹没有具体的定单。任一种
ONE TWO
TWO ONE是有可能的。甚至可以在下次重新编译(或运行)可执行文件时进行更改!
发布于 2021-09-27 08:38:33
你问题中的代码没有问题。
这段代码看起来非常像是为了演示像foo3(foo1(1),foo2(2))这样的调用的潜在问题,但是它没有做到这一点。
例如:
int foo1(int a){return a++;}表达式a++有一个副作用,但它与此无关。参数a是一个局部变量,当函数返回时它就不再存在了。它也可能只是return a; (除了增量溢出时可能出现的未定义行为)。
这是:
int n = 42;
int func(int param) { return param++; }返回值42,不影响n的值。++适用于n的副本,而不是n本身。C中的函数参数是通过值传递的。
这种调用的潜在问题是,参数的计算顺序不明确。调用foo1(1)和foo2(2)没有对调用方可见的副作用,但是像foo3(a++, a++)这样的调用会产生不同的结果,这取决于计算参数的未指定顺序。(我不能百分之百确定这种情况是否有未定义的行为;这取决于参数的计算之间是否存在顺序点。但是,仅仅是这种不确定性就足以避免编写这样的代码。)
https://stackoverflow.com/questions/69343430
复制相似问题