【问题标题】:Whats happening Here and also What's the output? (No clue)这里发生了什么以及输出是什么? (没有线索)
【发布时间】:2016-12-13 17:36:43
【问题描述】:

代码如下。请解释并给出输出。

#include <iostream>
#include <conio.h>

using namespace::std;

int main() {
//  clrscr();
    int sum(int(*)(int), int);
    int square(int);

    int cube(int);
    cout << sum(square, 4) << endl;
    cout << sum(cube, 4) << endl;
    getch();

//  return 0;
}

int sum(int(*ptr)(int k), int n){
    int s = 0;
    for(int i =1; i <= n; i++){
        s +=(*ptr)(i);
    }
    return s;
}

int square(int k){
    int sq;
    sq =k *k;
    return k*k;
}


int cube(int k){
    return k*k*k;
}

不知道发生了什么!请帮助我理解这段代码。特别是在功能上

int sum(int(*)(int), int);

尤其无法理解上述语法。但是解释整个代码会很有帮助。

【问题讨论】:

  • 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。
  • 有一个工具叫做调试器。有了它,您可以逐行浏览代码并观察它的运行情况。 type (*possible_name)(parameters) 也是一个函数指针。
  • 看起来很奇怪的代码是声明函数的参数本身就是另一个具有 int 类型参数的函数。可以这样想,您正在将函数的地址传递给另一个函数。然后被调用的函数可以使用该地址来调用它指向的函数。
  • @Slava 我知道指针和函数。但是这种语法对我来说是新的
  • @DewangGupta 那么,在向这里提问之前,您是否尝试过至少对它进行一些研究?

标签: c++ function pointers output


【解决方案1】:

以下是您的程序实际执行的操作:

n = 4时,函数sum(square, 4)被调用。

  • 这反过来又调用square() 方法并将*ptr 的值计算为1,然后s 将变为1 加上0+1*ptr 是 通过调用square() 方法将值分配为1 返回值1*1,然后分配给*ptr

  • 当 i = 2 时,再次调用 square() 方法,并且值 4 被分配给 (*ptr)(2),因为它是由 2*2 返回的 在这种情况下,方法square()。值4s 中的值相加,即1s 的值变为1+4=5

  • 当 i = 3 时,再次调用 square() 方法,并且 9 被分配给 (*ptr)(3),因为它是由 3*3 返回的 在这种情况下,方法square()。值9s 中的值相加,即5s 的值变为5+9=14

  • 最后,当 i = 4 时,再次调用 square() 方法,并且值 16 被分配给 (*ptr)(4),因为它是由 4*4 返回的 在这种情况下,方法square()。值9s 中的值相加,即14s 的值变为14+16=30

  • 函数返回值30,通过以下方式获得 调用此方法的main()

调用sum(cube, 4) 的工作原理与上面的解释非常相似。唯一的区别是它正在调用cube(int) 方法,并且分配给(*ptr)(i) 的值将是从cube() 方法返回的i*i*is 的值最初将为零,然后将添加到 s = 1 (0+1)s = 9 (1+8)s = 36 (9+27),最后是 s=100 (36+64),返回到调用它的 main() 方法。

换句话说,您的程序将类似于以下代码:

#include <iostream>

int sum(std::string, int);
int square(int);
int cube(int);

int main() {

    std::cout << sum("square", 4) << std::endl;
    std::cout << sum("cube", 4) << std::endl;

    return 0;
}

int sum(std::string value, int n) {
    int s = 0;
    for (int i = 1; i <= n; i++) {
        if (value == "square") {
            s = s + square(i);
        } else if (value == "cube") {
            s = s + cube(i);
        }
    }
    return s;
}

int square(int k) {
    return k*k;
}

int cube(int k) {
    return k * k * k;
}

我建议您在程序的sum() 方法内的for 循环中使用std::cout,以自己查看和分析结果。如果您的 IDE 支持,您还可以使用调试器查看程序的工作流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多