【问题标题】:Explanation for output of given code给定代码的输出说明
【发布时间】:2017-06-23 07:08:03
【问题描述】:
#include <stdio.h>

int sum(int a, int b, int c) {
    return a + b + c / 2;
}

void main() {
    int (*function_pointer)(int, int, int);     // how this will be interpreted
    function_pointer = sum;
    printf("%d", function_pointer(2, 3, 4));
    return ;
}

当我在 ide 上运行时,它给出了输出 7,我不明白怎么做?

【问题讨论】:

  • 第一行是#include 抱歉
  • 为你解决了这个问题
  • 期望的输出是什么?以及为什么对你而言,将一个包含除法的函数称为“sum”?
  • 2 + 3 + 4 / 2 = 7 没关系。如果您的意思是平均数,请使用括号:(2 + 3 + 4) / 2 = 4
  • @tilz0R:但要小心整数运算的幽灵。那将是下一件事。

标签: c function output function-pointers


【解决方案1】:

声明

int (*function_pointer)(int, int, int);   

声明一个指向函数的指针,该函数接受三个int 参数并返回一个int。后者 this 指向函数sum 并用于调用该函数。

sum函数内部声明

return a + b + c / 2;  

被解析为

return a + b + (c / 2); // division operator has higher precedence than + operator 
                       //  and therefore the operands `c` and `2` will be bind to `/` operator

【讨论】:

  • 不错的答案,但我认为 OP 正在努力解决婴儿级运算符优先级知识。
  • @Bathsheba 根据 OPs 代码中的评论,答案直接是为了他的挣扎。
  • @Bathsheba; “婴儿”很搞笑:D
【解决方案2】:

这个:

int (*function_pointer)(int, int, int); 

表示您正在定义一个名为 function_pointer 的函数指针,它可以用作任何其他 以 3 个整数作为参数的函数的别名 返回一个整数

那么当你这样做时:

function_pointer = sum;

您正在将函数 sum 的地址分配给 function_pointer,这意味着稍后,您可以同时执行以下操作:

function_pointer(2, 3, 4)

sum(2, 3, 4)

现在来看结果,为什么会打印出 7

a + b + c / 2

with 2,3,4 等同于 2 + 3 + 4 / 22 + 3 + 2 = 7

【讨论】:

  • 我明白了,只有一个问题 function_pointer() 会指向所有函数(其返回类型为 int 并接受三个 int 参数)或仅指向分配给它的函数。
  • 嗨@amankhunt,就像一个指针,但只是它保存另一个函数的地址......是的......它只适用于分配给它的那些:)跨度>
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 2012-08-12
  • 2016-04-17
  • 2019-08-31
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多