簡體   English   中英

確認對函數指針的理解

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM