Re: [問題] cpp中if的==與=差別

作者: loveme00835 (髮箍)   2020-06-10 16:33:54
※ 引述《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 應該沒什麼疑問才對.
作者: lc85301 (pomelocandy)   2020-06-11 00:54:00
出現了,是自動上色大大
作者: Dracarys (MayShowGunMore)   2020-06-11 01:23:00
大神把C++20 DIS讀完了嗎XD
作者: michael0728n (蒜˙遠古)   2020-06-11 20:27:00
酷~
作者: HwangTW (谷歌翻譯王)   2020-06-12 14:35:00
好可怕…腦袋在顫抖
作者: ofd168 (大色狼來襲)   2020-06-13 12:48:00

Links booklink

Contact Us: admin [ a t ] ucptt.com