По умолчанию класс (ы) потока будет сериализовать bool
как 0
или 1
. Они также будут читать 0
или 1
при десериализации.
Чтобы напечатать строку (и) true
или false
, вам нужно использовать модификатор потока std::boolalpha
, чтобы изменить поведение потока для печати (или чтения) текстовой версии логических значений. 1110]
См. Ниже:
#include <iostream>
#include <iomanip>
int main ()
{
bool a = false;
bool b = true;
std::cout << std::boolalpha << a << " : " << b << '\n';
std::cout << std::noboolalpha << a << " : " << b << '\n';
// If you want to read a bool as 0 or 1
bool check;
if (std::cin >> std::noboolalpha >> check) {
std::cout << "Read Worked: Got: " << check << "\n";
}
else
{
std::cout << "Read Failed\n";
}
// PS. If the above read failed.
// The next read will also fail as the stream is in a bad
// state. So make the above test work before using this code.
// If you want to read a bool as true or false
bool check;
if (std::cin >> std::boolalpha >> check) {
std::cout << "Read Worked: Got: " << check << "\n";
}
else
{
std::cout << "Read Failed\n";
}
}
Это только происходит в Отладке, не в Выпуске. Я подозреваю, что помогает во время отладки. Это, возможно, позволяет Вам зажимать точки останова середина оператора и видеть возвращаемое значение.
Обратите внимание, что версия выпуска имеет намного более краткий IL:
.method private hidebysig static void Main(string[] args) cil managed
{
.maxstack 8
L_0000: ldstr "input"
L_0005: stsfld string Reflector_Test.Program::input
L_000a: ldsfld string Reflector_Test.Program::input
L_000f: call string Reflector_Test.Program::CallMe(string)
L_0014: stsfld string Reflector_Test.Program::output
L_0019: ret
}
.method public hidebysig static string CallMe(string input) cil managed
{
.maxstack 8
L_0000: ldstr "output"
L_0005: stsfld string Reflector_Test.Program::output
L_000a: ldsfld string Reflector_Test.Program::output
L_000f: ret
}
Мое предположение - то, что это - шаблонный код для выполнения оператора возврата, компилятор выполняет безусловный переход к последней строке и загружает возвращаемое значение в регистр прежде, чем выполниться ret
. JIT оптимизирует его лучше, я думаю, что компилятор не потрудился делать любые оптимизации.