代码如下。请解释并给出输出。
#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);
特别是无法理解上述语法。但是解释整个代码会有所帮助。
答案 0 :(得分:0)
以下是您的计划实际执行的操作:
当n = 4
时,调用函数sum(square, 4)
。
这反过来调用square()
方法并计算
的值
*ptr
为1
,然后s
将1
添加0+1
。 *ptr
是
通过调用1
方法将值指定为square()
返回值1*1
,然后将其分配给*ptr
。
当i = 2时,再次调用square()
方法并且值为。{
4
被(*ptr)(2)
分配给2*2
,因为它是square()
返回的
在这种情况下,方法4
。值s
最多会加到1
s
的值1+4=5
,square()
的值变为9
。
当i = 3时,再次调用(*ptr)(3)
方法并且值为。{
3*3
被square()
分配给9
,因为它是s
返回的
在这种情况下,方法5
。值s
最多会加到5+9=14
square()
的值16
,(*ptr)(4)
的值变为4*4
。
最后,当i = 4时,再次调用square()
方法并且值为。{
9
被s
分配给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::cout
,for
,sum()
,最后为@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支持,您还可以使用调试器查看程序的工作流程。