加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读