这里发生了什么,还有输出是什么?(无线索)

Whats happening Here and also What's the output? (No clue)

本文关键字:线索 是什么 输出 什么 发生了 这里      更新时间:2023-10-16

代码如下。请解释并提供输出。

#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);

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

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

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()4的值与s中的值相加,该值1s的值变为1+4=5

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

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

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

调用sum(cube, 4)的工作方式与上述解释非常相似。唯一的区别是,它正在调用cube(int)方法,并且分配给(*ptr)(i)的值将i*i*icube()方法返回的值。s的值最初为零,加起来为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 支持调试器,还可以使用调试器查看程序的工作流。