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