为什么 (*callback)() 在 C++ 中工作而不是 *callback() 或 *callback

Dem*_*314 3 c++ callback operator-precedence

我是一名 C++ 初学者,我认为要真正学习指针和引用,我应该尝试创建一个回调函数,这在 JavaScript 中是理所当然的。

但是,对于我的一生,我不知道为什么这些括号如此重要,(*callback)()如果有人可以向我解释,我会很高兴。

这是我编写的一些以某种方式起作用的代码:

#include<cstdio>

void function_two()
{
    printf("then this runs!");
}

void function_one(void (*callback)() = nullptr)
{
    printf("this runs first");
    if(callback != nullptr)
    {
        (*callback)();
    }
}

int main()
{
    function_one(&function_two);
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 8

事实上,你可以只写

callback();
Run Code Online (Sandbox Code Playgroud)

如果您使用的是一元解引用运算符 *,那么它相对于后缀函数调用运算符具有较低的优先级。所以你必须写

(*callback)();
Run Code Online (Sandbox Code Playgroud)

否则这样的电话

*callback();
Run Code Online (Sandbox Code Playgroud)

被编译器认为是对函数调用结果的取消引用。

请记住,你甚至可以这样写

(******callback)();
Run Code Online (Sandbox Code Playgroud)

因为在表达式中,函数指示符被转换为指向函数的指针。


Jes*_*uhl 6

*callback()所调用operator()callback然后解除引用(*)该函数调用的结果。

(*callback)()取消引用callback,然后调用operator()该取消引用的结果。

两件非常不同的事情。

*callback只是取消引用指针,但对结果没有任何作用。语义有效,但在此上下文中不做任何事情。

另请参见C++ 运算符优先级