簡體   English   中英

為什么 cout 語句在傳遞指向 function 的指針時沒有執行?

[英]Why cout statement is not executing in passing pointer to function?

function 調用 swap 中的 cout 語句未執行。 為什么?

#include <iostream>

using namespace std;

void swap(int *a, int *b) {
  int temp = *a;
  *a = *b;
  *b = temp;
  cout << "Value Swapped" << endl;
}

int main() {
  int x = 400, y = 100;
  swap(x, y);
  cout << "x = " << x << " y = " << y << endl;
  return 0;
}

我預計低於 output:

Value Swapped
x = 100 y = 400

但是我得到的 output 是:

x = 100 y = 400

您沒有看到“交換值”,因為您的交換 function 永遠不會被調用。 相反,您正在調用std::swap<int>

如果你沒有說using namespace std; ,您會發現您的swap function 正在傳遞整數,但期待指針。 原因 #1 不使用using namespace std; ——你很容易最終不叫你認為你是什么。 :)

您的 function 交換期望指針為 arguments,但您傳遞的是整數。 所以不是調用你的 function,而是調用 c++ 交換 function。 為了更好地理解這一點,將 function 名稱“swap”更改為任何其他名稱,如“swapp”,您將看到以下錯誤:

invalid conversion from int to int*

寫 swap(&x, &y) 你會得到你想要的 output

考慮選擇一個足夠唯一的標識符名稱,這樣就不會與namespace標識符發生沖突(如在std::swap中)。 如果您無法選擇標識符的名稱, put it inside of a namespace中。

其次,如果編譯器不強制執行 state 的 function 聲明,則應手動檢查是否正確傳遞了變量(即&x&y而不是xy )。

using namespace std將另一個同名的 function 從命名空間std導入全局命名空間,因此您最終會得到兩個重載:

swap(int&, int&); // from std; actually a template instantiation
swap(int*, int*);

您將swap稱為

swap(x, y);

現在考慮: xy的類型是什么,它們是指針嗎? 所以自己決定,哪個重載會被調用?

如果您沒有通過using namespace std導入第二個重載,無論如何這通常被認為是不好的做法(好吧,您立即成為陷阱的受害者......),您最終會出現編譯錯誤(整數不會隱式轉換為指針。)。

要讓您的function 被調用,您需要從以下位置進行指針:

swap(&x, &y);
//   ^   ^

實際上,即使使用導入的命名空間(盡管是不好的做法),這也可以工作,因為導入的重載是一個模板,你的是一個普通的 function,因此你的被認為是更專業的重載,因此將是首選。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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