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