表达式(a==1)&&(a==2)&&(a==3)能否为真?含C++与JavaScript相关问询
问题1:表达式
(a==1)&&(a==2)&&(a==3)能否被求值为true?该写法是否具备实用性? 答案是能,最典型的场景是在JavaScript里,利用语言的类型转换机制和对象方法重写就能实现。
比如我们可以定义一个对象a,重写它的valueOf方法——每次当a被用于比较(会触发隐式类型转换调用valueOf)时,返回当前的计数然后自增:
let a = { _count: 1, valueOf() { return this._count++; } }; console.log((a == 1) && (a == 2) && (a == 3)); // 输出 true
至于实用性?几乎为零。这纯粹是利用语言特性玩的奇技淫巧,也就是面试题里可能用来考察你对JS类型转换、对象方法的理解,但真要在生产代码里这么写,绝对会被同事吐槽到怀疑人生——可读性极差,后续维护的人根本看不懂这段代码的意图,还容易埋下莫名其妙的bug,完全不推荐。
问题2:在C++中,表达式
(a==1)&&(a==2)&&(a==3)能否被求值为true?若可以,该写法是否具备实际实用性? 同样可以实现,C++的运算符重载特性给了我们操作空间,这里提供两种常见的实现方式:
方式1:重载operator==
定义一个类,让它的==运算符在每次和整数比较时,返回当前值是否匹配,然后自增内部计数:
#include <iostream> class MagicA { private: int _val = 1; public: bool operator==(int target) { return _val++ == target; } }; int main() { MagicA a; if ((a == 1) && (a == 2) && (a == 3)) { std::cout << "true" << std::endl; // 会输出true } return 0; }
方式2:利用隐式类型转换
重载类的operator int(),让对象在和整数比较时自动转换为当前计数,然后自增:
#include <iostream> class MagicA { private: int _val = 1; public: operator int() { return _val++; } }; int main() { MagicA a; if ((a == 1) && (a == 2) && (a == 3)) { std::cout << "true" << std::endl; // 同样输出true } return 0; }
至于实用性?同样没有实际生产价值。这也是C++特性的花式玩法,顶多面试时用来考察你对运算符重载、隐式转换的掌握程度,但实际项目里这么写绝对是灾难——代码逻辑晦涩难懂,维护成本极高,还容易引发意料之外的行为,正经项目里完全不会这么写。
内容的提问来源于stack exchange,提问作者mathreadler
相关产品推荐
相关产品推荐

