gpt4 book ai didi

又是 C++ 函数指针。语法困惑

转载 作者:太空狗 更新时间:2023-10-29 20:33:19 25 4
gpt4 key购买 nike

关于 this page我在 C++ 中找到了函数指针的一个很好的例子(以及仿函数,但这个问题与仿函数无关)。以下是该页面的一些拷贝。

#include <iostream>

double add(double left, double right) {
return left + right;
}

double multiply(double left, double right) {
return left * right;
}

double binary_op(double left, double right, double (*f)(double, double)) {
return (*f)(left, right);
}

int main( ) {
double a = 5.0;
double b = 10.0;

std::cout << "Add: " << binary_op(a, b, add) << std::endl;
std::cout << "Multiply: " << binary_op(a, b, multiply) << std::endl;

return 0;
}

我大致理解代码,但有几处我总是感到困惑。函数 binary_op() 接受一个函数指针 *f,但是当它被使用时,例如在第 19 行 binary_op(a, b, add) ,函数符号 add 被传入,而不是人们认为的指针 &add 。现在你可能会说这是因为符号add 一个指针;它是与函数 add() 对应的代码位的地址。很好,但是这里似乎仍然存在类型差异。函数 binary_op() 采用 *f,这意味着 f 是指向某物的指针。我传入add,它本身就是一个指向代码的指针。 (对吗?)然后 f 被赋予 add 的值,这使得 f 成为指向代码的指针,这意味着 f 是一个类似于 add 的函数,这意味着 f 应该像 f(left, right) 一样被调用,具体如何 add 应该被调用,但是在第 12 行,它被称为 (*f)(left, right),这对我来说似乎不正确,因为它就像写(*add)(left, right),而*add不是函数,是add指向的代码的第一个字符到。 (对吗?)

我知道将 binary_op() 的原始定义替换为以下内容也可以。

double binary_op(double left, double right, double f(double, double)) {
return f(left, right);
}

事实上,这对我来说更有意义,但正如我上面解释的那样,原始语法没有意义。

那么,为什么使用 (*f) 而不是 f 在语法上是正确的?如果符号 func 本身就是一个指针,那么短语“函数指针”或“指向函数的指针”究竟是什么意思呢?按照目前的原始代码,当我们写double (*f)(double, double)时,f是一个什么样的东西呢?指向指针的指针(因为 (*f) 本身就是指向一段代码的指针)?符号 add 是和 (*f) 一样的东西,还是和 f 一样的东西?

现在,如果所有这些的答案是“是的,C++ 语法很奇怪,只需记住函数指针语法,不要质疑它。”,那么我会很不情愿地接受它,但是我真的很想正确解释我在这里的想法。

我读过 this question我想我明白这一点,但没有发现它有助于解决我的困惑。我也读过 this question ,这也没有帮助,因为它没有直接解决我的类型差异问题。我可以继续阅读互联网上的海量信息来找到我的答案,但是嘿,这就是 Stack Overflow 的用武之地吧?

最佳答案

这是因为C函数指针比较特殊。

首先,表达式add 将衰减为一个指针。就像对数组的引用会衰减为指针一样,对函数的引用也会衰减为指向函数的指针。

然后,奇怪的东西就在那里:

return (*f)(left, right);

So, why is it syntactically correct to use (*f) instead of just f?

两者都有效,你可以这样重写代码:

return f(left, right);

这是因为取消引用运算符将​​返回对函数的引用,并且对函数的引用或函数指针都被认为是可调用的。

有趣的是,函数引用很容易衰减,以至于在调用解引用运算符时它会退化回指针,从而可以根据需要多次解引用函数:

return (*******f)(left, right); // ah! still works

关于又是 C++ 函数指针。语法困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56006752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com