[英]Confirm Understanding about Pointers to Functions
作為一名 C++ 學習者,我在 C++ 語言教程中遇到了以下代碼並提出了兩個問題,有沒有專家可以提供一些指導?
#include <iostream>
using namespace std;
int addition (int a, int b)
{ return (a+b); }
int subtraction (int a, int b)
{ return (a-b); }
int operation (int x, int y, int
(*functocall)(int,int))
{
int g;
g = (*functocall)(x,y);
return (g);
}
int main () {
int m,n;
int (*minus)(int,int) = subtraction;
m = operation (7, 5, addition);
n = operation (20, m, minus);
cout <<n;
return 0;
}
在函數“操作”定義中:
問題1:對於“g = (*functocall)(x,y)”,它是否尊重指向函數的指針(ex.subtraction)並將其分配給g?
問題 2:對於“return(g)”,我想知道為什么我們為 g 加上括號?
而對於“int (*minus)(int,int) = 減法;” 在主函數中,如果我們改為編寫以下內容可以嗎?
整數(*減)(整數,整數)
減 = 減
在開始之前,你的代碼使用比它需要更多的方式括號。
這是相同的代碼,更好地格式化和減少:
#include <iostream>
using namespace std;
int addition (int a, int b)
{ return a+b; }
int subtraction (int a, int b)
{ return a-b; }
int operation (int x, int y, int (*functocall)(int,int))
{
int g;
g = functocall(x,y);
return g;
}
int main () {
int m,n;
int (*minus)(int,int) = subtraction;
m = operation (7, 5, addition);
n = operation (20, m, minus);
cout <<n<<"\n";
return 0;
}
對於“g = (*functocall)(x,y)”,它是否尊重指向函數的指針(ex.subtraction)並將其分配給g?
簡而言之 - 是的。 當通過它的指針調用一個函數時,沒有必要顯式地取消引用它。 我知道,這很令人驚訝,而且與通常使用指針的方式背道而馳。
這么想吧。 每當你只是寫一個函數的名字時,你本質上就是在獲取函數的指針。 這就是為什么你像你一樣寫,而不是寫:
m = operation (7, 5, &addition);
使用函數指針時不需要顯式取消引用,原因與首先獲取操作符address of
時不需要顯式使用操作符的地址相同。
問題 2:對於“return(g)”,我想知道為什么我們為 g 加上括號?
肯定沒有充分的理由。 事實上,沒有理由為您的任何return
語句執行此操作。
而對於“int (*minus)(int,int) = 減法;” 在主函數中,如果我們改為編寫以下內容可以嗎?
int (*minus)(int,int); minus = subtraction;
就個人而言,我建議您使用:
int (*minus)(int,int) = nullptr;
minus = subtraction;
以免留下未初始化的變量,否則,是的,絕對。 指向函數變量的指針就像任何其他變量一樣。
問題 1:對於
g = (*functocall)(x,y)
,它是否尊重指向函數的指針(ex.subtraction)並將其分配給 g?
回答:沒有。
(*functocall)(x,y);
只是從作為參數傳遞的指針調用函數的一種允許的語法。 它完全等同於:
functocall(x,y);
這只是消除了允許但不必要的(*...)
語法。
問題 2:對於
return(g)
,我想知道為什么我們為 g 加上括號?
括號也是隨意的,對於返回來說是多余的。 簡單提供:
return g;
因為沒有表達式要求由封閉(..)
提供的評估優先級,所以只需要這些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.