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

看板C_and_CPP作者 (髮箍)時間4年前 (2020/06/10 16:33), 4年前編輯推噓5(500)
留言5則, 5人參與, 4年前最新討論串2/2 (看更多)
※ 引述《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
大神把C++20 DIS讀完了嗎XD
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
文章代碼(AID): #1Uu9hszm (C_and_CPP)
文章代碼(AID): #1Uu9hszm (C_and_CPP)