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)
事实上,你可以只写
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)
因为在表达式中,函数指示符被转换为指向函数的指针。
*callback()所调用operator()上callback然后解除引用(*)该函数调用的结果。
(*callback)()取消引用callback,然后调用operator()该取消引用的结果。
两件非常不同的事情。
*callback只是取消引用指针,但对结果没有任何作用。语义有效,但在此上下文中不做任何事情。
另请参见C++ 运算符优先级
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |