c – 逻辑运算符执行顺序
发布时间:2020-12-16 10:14:20 所属栏目:百科 来源:网络整理
导读:我有关于运算符重载的问题,并附带一个有趣的代码: #include iostreamclass A {public: operator bool() { return true; } bool operator!() { return false; }};int main() { A a; if (!a) { std::cout "HELLO"; } else { std::cout "WORLD"; } std::cout s
我有关于运算符重载的问题,并附带一个有趣的代码:
#include <iostream> class A { public: operator bool() { return true; } bool operator!() { return false; } }; int main() { A a; if (!a) { std::cout << "HELLO"; } else { std::cout << "WORLD"; } std::cout << std::endl; return 0; } 什么将首先被称为什么?为什么?这是在cppreference的任何地方描述的吗? 附:对于那些认为我自己无法执行此代码的downvoters和其他人.我可以.我做到了.我已多次改变它以查看它的行为.所以呢?这不是解释.我已经要求提供一个参考,清楚地说明了这个代码服从的规则.它在我的机器上如何工作的信息并没有回答这个问题 – 如果它甚至不能在不同的环境(操作系统,可能是处理器等)中移植,该怎么办? 解决方法
它的工作原理很简单.编译器解析源并查看是否(!a).然后它检查A是否定义了一个运算符!就是这样.这样就被召唤了.
如果它已经看过(a)它是否会检查A是否可以转换为可以在if的条件下使用的东西.碰巧它确实可以转换. 如果没有运算符!,编译器会检查A可以转换为可能在逻辑上否定的东西.然后将执行转换为bool. 顺便说一下,即使在令人惊讶的地方也会发生转换.例如,1将编译.我认为不是我们想要的.最好只允许boo在上下文中的位置.您可以通过显式标记转换运算符来实现: explicit operator bool() { return true; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |