作者loveme00835 (发箍)
看板C_and_CPP
标题Re: [问题] cpp中if的==与=差别
时间Wed Jun 10 16:33:54 2020
※ 引述《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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1591778038.A.F70.html
※ 编辑: loveme00835 (61.216.75.43 台湾), 06/10/2020 17:32:22
1F:推 lc85301: 出现了,是自动上色大大 06/11 00:54
2F:推 Dracarys: 大神把C++20 DIS读完了吗XD 06/11 01:23
3F:推 michael0728n: 酷~ 06/11 20:27
4F:推 HwangTW: 好可怕…脑袋在颤抖 06/12 14:35
5F:推 ofd168: 跪 06/13 12:48