【问题标题】:Dealing with function call syntax outside of function处理函数外的函数调用语法
【发布时间】:2015-10-22 15:19:50
【问题描述】:

如果这是非常初级的,我深表歉意,但我刚开始在学校编程,我已经到处寻找解决方案,不幸的是没有任何帮助。 我有这段代码:

   #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int logic(int a, int b)
{
    int c = a % b;
    a++;
    b--;
    printf("==%d %d %d==\n", a, b, c);
    return b + a + c;
}

int main()
{
    int a, c;
    float d, f;
    a = 10;
    c = 5;
    f = 2;

    d = logic(a, logic(c, f));
    printf("%d %d %.2f %.2f\n", a, c, d, f);
    return 0;
}

现在的输出是:

'== 6 1 1==
==11 7 2==
10 5 20.00 2.00'

现在的问题是'd = logic(a, logic(c, f));' 行如何编译上面的逻辑函数。我假设要获得第一个输出,逻辑函数将 c 和 f 的值取为 5 和 2,并通过 a 和 b 的函数运行它。但我完全不知道为什么下一个输出是'==11 7 2=='。 return 'c + b + a;' 的作用是什么,当我用逗号替换 + 运算符时,只有输出中的第一个值(无论我放置变量的顺序如何,都是 11)出现,其余的都是 0。

请帮忙解决这个问题,我非常难过,已经做了几个小时了,但还是一无所获。

【问题讨论】:

  • 我相信缺少一段代码。您是否可以添加它并更好地澄清您不理解的地方?
  • 不,就是这样。这正是上述内容的输出。我试图了解第一个输出是 6 1 1,而第二个输出是 11 7 2,我不明白第二个输出是如何发生的。
  • 请注意,我们在这里处理 两组 局部变量。 logic() 的参数名为 ab,但这些名称是 locallogic() 的,与 main() 中声明的 ab 无关.
  • 好的......所以请注意解释,如果 main 的本地值与逻辑值不同,那么输出是如何得到这样的答案的。
  • 另请注意,输出 仅来自printf(...) 行。 return b + a + c; 计算 b、a 和 c 的总和,并将总和的值作为函数的结果返回以供进一步计算。因此,要更改屏幕上 输出 的外观,您必须更改 printf 行,这与计算总和的顺序完全无关。

标签: function call walkthrough


【解决方案1】:

我假设要获得第一个输出,逻辑函数将 c 和 f 的值取为 5 和 2,并通过 a 和 b 的函数运行它。

没错。起初发生的事情相当于调用logic( 5, 2 )。注意两点:a) 在函数logic 内部,我们有一个printf,它将一些输出打印到屏幕上,b) 函数logic 返回 类型为int 的值。 这就是int logic(int a, int b) 中的第一个int 所表示的。

现在让我们看看原来的调用:

d = logic(a, logic(c, f));

这告诉机器我们要获取函数logic返回的值并存储在变量d中。但是,要调用 logic,我们需要两个 int 参数。第一个以变量a 的形式给出,但要找到第二个参数的值,需要首先执行一个函数,在这种情况下恰好是logic

这与普通数学中的相同:要计算 f(g(x)),您必须首先计算 g(x) 并将结果用作 f 的输入。在程序中,你也可以使用另一个变量来存储中间结果,比如int g_result = g(x); f( g_result );,这是完全等价的。

所以,要计算logic(a, logic(c, f)); 的结果,logic 需要运行两次。每次执行 logic 时,它都会穿过 printf 并在屏幕上产生一些输出。

这就是为什么我们得到两行输出“== ... ==”,每次运行函数logic

如上所述,您可以等效地写:

int first_result = logic( c, f ); // This call produces the output of "== 6 1 1==" and returns the value 8 (= 6 + 1 + 1) which gets assigned to "first_result"

d = logic( a, first_result ); // This call produces the output of "==11 7 2==" from the function parameters "a" (=10) and "first_result" (=8).

【讨论】:

  • 非常感谢您。我看到的第一篇非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多