什么事发生在这里以及输出是什么? (没有线索)

时间:2016-12-13 17:36:44

标签: c++ function pointers output

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

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

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

1 个答案:

答案 0 :(得分:0)

以下是您的计划实际执行的操作:

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

  • 这反过来调用square()方法并计算
    的值 *ptr1,然后s1添加0+1*ptr是 通过调用1方法将值指定为square() 返回值1*1,然后将其分配给*ptr

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

  • 当i = 3时,再次调用(*ptr)(3)方法并且值为。{ 3*3square()分配给9,因为它是s返回的 在这种情况下,方法5。值s最多会加到5+9=14 square()的值16(*ptr)(4)的值变为4*4

  • 最后,当i = 4时,再次调用square()方法并且值为。{ 9s分配给14,因为它是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; } 的值最初为零,最多为std::coutforsum(),最后为@echo off echo Copying echo "%1" echo to "%2" echo. echo Press Cntr+C to abort Pause echo. @echo on robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information" ,并返回robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\ 调用它的方法。

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

$ g++ example.cc -lcfgparser
: In function `main':
example.cc:(.text+0x6b): undefined reference to `ConfigParser_t::readFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cc:(.text+0x160): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
example.cc:(.text+0x2d9): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*) const'
example.cc:(.text+0x43c): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double*) const'
example.cc:(.text+0x5b1): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool*) const'
example.cc:(.text+0x78c): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*) const'
example.cc:(.text+0xa15): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
example.cc:(.text+0xba2): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
example.cc:(.text+0xd15): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
example.cc:(.text+0xe7f): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
collect2: error: ld returned 1 exit statu

我建议您在程序的$ nm -gC /usr/lib/libcfgparser.so 000000000003710 T ConfigParser_t::readFile(std::string const&) 0000000000004880 T ConfigParser_t::ConfigParser_t(std::string const&) 00000000000024c0 T ConfigParser_t::ConfigParser_t() 0000000000004ad0 T ConfigParser_t::ConfigParser_t(std::string const&) 00000000000024a0 T ConfigParser_t::ConfigParser_t() 0000000000004d20 T ConfigParser_t::getOptions(std::string const&) const 00000000000028d0 T ConfigParser_t::getSections() const 0000000000002ff0 T ConfigParser_t::getValue(std::string, std::string, bool*) const 0000000000002de0 T ConfigParser_t::getValue(std::string, std::string, double*) const 0000000000002bd0 T ConfigParser_t::getValue(std::string, std::string, int*) const 00000000000027d0 T ConfigParser_t::getValue(std::string, std::string, std::string*) const 0000000000003500 T ConfigParser_t::getValue(std::string, std::string, std::vector<std::string, std::allocator<std::string> >*) const 方法中的{{1}}循环中使用{{1}}来自行查看和分析结果。如果IDE支持,您还可以使用调试器查看程序的工作流程。