提倡有关逻辑运算的问题

时间:2019-05-29 19:12:17

标签: c++ boost

最近,我使用了boost::logic::tribool,这对我来说很奇怪。

#include <iostream>
#include "boost/logic/tribool.hpp"


int main()
{
    boost::logic::tribool test = true && boost::logic::indeterminate;

    if(test)
    {
     std::cout << "Executes?" << std::endl;
    }

    if (true && boost::logic::indeterminate)
    {
      std::cout << "Executes 2" << std::endl;
    }

}

打印ExecutesExecutes 2。 为什么这些条件成立? 我完全确定使用(不确定状态,true)的AND运算会返回不确定状态?

boost.org引用if中的布尔上下文

“如果三态布尔值为true,则返回true,否则返回false”

编辑:在评论之后,我要添加此内容。 这是我读过的最不直观的代码。

#include <iostream>
#include "boost/logic/tribool.hpp"


int main()
{
    boost::logic::tribool test = boost::logic::tribool(true) && boost::logic::indeterminate;

    if(test)
    {
     std::cout << "This will NOT execute" << std::endl;
    }

    boost::logic::tribool second = true && boost::logic::indeterminate;

    if (second)
    {
      std::cout << "This will execute" << std::endl;
    }

}

EDIT2:我需要纠正自己... 有人可以解释吗?

#include <iostream>
#include "boost/logic/tribool.hpp"

boost::logic::tribool LOL( )
{
   return    boost::logic::indeterminate;
}

int main()
{

 boost::logic::tribool LOL_RESULT = LOL();

    if (boost::logic::indeterminate)
    {
        std::cout << "IT WILL BE EXECUTED" << std::endl;
    }

    if (LOL_RESULT)
    {
      std::cout << "IT WILL NOT BE EXECUTED"   << std::endl;
    }
}

1 个答案:

答案 0 :(得分:1)

TEST(junk, tribool)
{
    auto v = boost::logic::indeterminate;
    GTEST_MESSAGE() << typeid(v).name();
}

结果:

[----------] 1 test from junk
[ RUN      ] junk.tribool
[   NOTE   ] bool (__cdecl*)(class boost::logic::tribool,struct boost::logic::detail::indeterminate_t)

boost::logic::indeterminate是一个函数 。因此它的评估结果为true。

TEST(junk, tribool)
{
    boost::logic::tribool test = true && boost::logic::tribool{ boost::logic::indeterminate_keyword_t() };

    if (test)
    {
        GTEST_MESSAGE() << "Executes?" << std::endl;
    }

    if (true && boost::logic::tribool{ boost::logic::indeterminate_keyword_t() })
    {
        GTEST_MESSAGE() << "Executes 2" << std::endl;
    }
}

结果:

[----------] 1 test from junk
[ RUN      ] junk.tribool
[       OK ] junk.tribool (64970 ms)
[----------] 1 test from junk (68580 ms total)