这里发生了什么,还有输出是什么?(无线索)
Whats happening Here and also What's the output? (No clue)
代码如下。请解释并提供输出。
#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
中的值相加,该值1
,s
的值变为1+4=5
。当 i = 3 时,再次调用
square()
方法,并且9
被分配给(*ptr)(3)
,因为它3*3
返回 在这种情况下,该方法square()
。9
的值与s
中的值相加,该值5
,s
的值变为5+9=14
。最后,当 i = 4 时,再次调用
square()
方法,并且16
被分配给(*ptr)(4)
,因为它4*4
由 在这种情况下,该方法square()
。9
的值与14
的s
值相加,s
的值变为14+16=30
。值
30
由函数返回,由下式获得 调用此方法的main()
。
调用sum(cube, 4)
的工作方式与上述解释非常相似。唯一的区别是,它正在调用cube(int)
方法,并且分配给(*ptr)(i)
的值将i*i*i
从cube()
方法返回的值。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 支持调试器,还可以使用调试器查看程序的工作流。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 这里发生了什么,还有输出是什么?(无线索)