Повысить вопрос о логических операциях - PullRequest
2 голосов
/ 29 мая 2019

Недавно я использовал 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;
    }

}

Печать Executes и Executes 2. Почему эти условия верны? Я был полностью уверен, что операция И с (неопределенное состояние, истина) возвращает неопределенное состояние?

Цитата на boost.org о булевом контексте в if

"возвращает значение true, если логическое значение для 3 состояний имеет значение 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 Ответ

1 голос
/ 30 мая 2019
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 является функцией . Так что это оценивается как правда.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...