Re: [問題] cpp中if的==與=差別
※ 引述《HwangTW (谷歌翻譯王)》之銘言:
: 開發平台(Platform): (Ex: Win10, Linux, ...)
: Win10
: 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
: VC++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: iostream
: 問題(Question):
: if中==與=的差別
: 餵入的資料(Input):
: { 4,4,5,5,6,6,6,7,7,7,8,8 }
: 預期的正確結果(Expected Output):
: 7
: 錯誤結果(Wrong Output):
: 11
: 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
: 正確的:https://glot.io/snippets/fo6kxy21bw
: 錯誤的:https://glot.io/snippets/fo75qt5ijj
: 還請賜教,我還真的不知道為何會有這兩種寫法(汗
: 補充說明(Supplement):
operator=() 以及 operator==() 主要的差別在於 overloading (
重載) 的彈性. 前者只能以 non-static member function 的方式
存在; 後者作為 member 或 non-member 都可以.
這邊稍微講個題外話, 將 == 誤寫成 = 雖然好像是低級的錯誤; 但
在 mutation test 裡卻是一種判斷 test 品質的手法: 藉由改變使
用的運算子, 來看程式碼是否具有足夠的錯誤分辨能力.
同樣的概念也可以應用在開發上, 使用不同運算子會改變語意, 程
式行為會變得不一樣; 但也有另外一種情形: 不改變運算子, 藉由
改變呼叫到的函式來更改程式行為, 這個方法在 C++ 裡很常見, 我
們稱它為 static polymorphism (靜態多型). 如同下面的範例所示
std::cout << 1; // call operator<<(ostream&, int)
std::cout << "2"; // call operator<<(ostream&, const char*)
雖然重載可以使程式碼撰寫變方便快速; 但從另一個角度來說: 重
載也引入了語意改變的可能性, 造成程式行為分歧, 增加理解成本.
所以說它是雙刃劍也不為過.
再來回到你的程式碼, 陣列元素用 int 會因為語言限制無法重載,
語意無分歧. 但如果我們今天導入一個自訂型別 my_int 作為陣列
元素, 情況就不同了:
struct my_int {
my_int(int i) : i_(i) { }
operator int&() { return i_; }
int i_;
};
my_int data[12]={4,4,5,5,6,6,6,7,7,7,8,8};
網址: https://wandbox.org/permlink/db3WiVs3U23ZLQsW
my_int 提供了一個 conversion constructor 以及 convsersion
operator, 可以透過這兩個成員函式在 int 和 my_int 之間互轉,
甚至把 my_int 當作 int 物件般使用. 接著我們就可以隨意重載
operator=():
struct my_int {
// other codes here
bool operator=(const my_int& rhs) {
return i_ == rhs.i_;
}
// other codes here
};
網址: https://wandbox.org/permlink/RFVwVDIcEYD37N2J
上面的程式會印出 7 (這樣應該算寫對還是寫錯呢?).
不只測試, 在 C++ 裡我們為現存程式碼做擴充時通常也是依循這樣
的模式: 透過為類別加上 extension method 來新增功能, 也許是
重載具名函式, 也許是重載運算子 (只差在重載的彈性還有難度),
導致我們需要先具備上面提到的背景知識才能回答你的問題:
if中==與=的差別
差別取決於作用的運算元以及所有可能呼叫的重載版本, 如果運算
元型別全都是 primitive type 應該沒什麼疑問才對.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.75.43 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1591778038.A.F70.html
※ 編輯: loveme00835 (61.216.75.43 臺灣), 06/10/2020 17:32:22
推
06/11 00:54,
4年前
, 1F
06/11 00:54, 1F
推
06/11 01:23,
4年前
, 2F
06/11 01:23, 2F
推
06/11 20:27,
4年前
, 3F
06/11 20:27, 3F
推
06/12 14:35,
4年前
, 4F
06/12 14:35, 4F
推
06/13 12:48,
4年前
, 5F
06/13 12:48, 5F
討論串 (同標題文章)