Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2014, 17:55   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Имейте ввиду, что 0, который вводит потребитель с клавиатуры не есть двоичный ноль!
'0' == 0x30
'1' == 0x31
а вам надо 0x00

Соответственно в bool всегда записывается true. Именно true а не 1 или 0.
Читайте из cin в char переменну и потом сравнивайте.
char ch;
cin >> ch;
exit = ('0' == ch) ? true : false;

Цитата:
Сообщение от Haric_110 Посмотреть сообщение
Как я думаю, переменные типа bool принимают только два значения: 0 и -1 или это не всегда так?
Переменные типа bool принимают два значения - true и false.
На все остальное компилятор выдает предупреждение.

Последний раз редактировалось Stilet; 10.02.2014 в 18:10.
waleri вне форума Ответить с цитированием
Старый 10.02.2014, 18:20   #12
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

waleri

Имейте ввиду, что 0, который вводит потребитель с клавиатуры не есть двоичный ноль!

и опять же, хорошие новости в том, что такое возможно только в низкокачественном китайском C++.
В настоящем C++ оператор >> перегружен для типа bool и позволяет ввод только '0' или '1'. на выходе в переменной получаем false или true.
Rififi вне форума Ответить с цитированием
Старый 10.02.2014, 21:44   #13
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

waleri

Цитата:
Имейте ввиду, что 0, который вводит потребитель с клавиатуры не есть двоичный ноль!
Это в том смысле, что '0', введённый с клавиатуры занимает меньше памяти? А мне всегда было интересно: "а сколько памяти занимает логическая переменная? 1 бит?"
Но я думал, что логическая переменная работает так:
- если условие истинно, все её биты устанавливаются в 1 (true). В переводе в десятичную систему счисления это (-1);
- если условие ложно, все биты устанавливаются в 0 (false). В десятичную системе это, конечно, 0.
Haric_110 вне форума Ответить с цитированием
Старый 10.02.2014, 22:35   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

bool занимает один байт, может быть true или false и при переводе в int дает 1 и 0 соответственно.
waleri вне форума Ответить с цитированием
Старый 10.02.2014, 23:03   #15
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Спасибо. Вы, так сказать, удовлетворили моё любопытство.
Конечно, в разных языках программирования логические переменные ведут себя по-разному. В С++ случай удобный: bool весит 1 байт, 7 младших бит зарезервированы (равны нулю), младший бит принимает два значения 0 - ложь и 1 - истина. Я правильно понял? Я спрашиваю, потому что в начале темы автор сказал(а), что bool должна принимать любое число.
Haric_110 вне форума Ответить с цитированием
Старый 10.02.2014, 23:04   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если не ошибаюсь там схема следующая: Если все биты нули то это false, иначе true. Т.е. если хотя бы один из битов единица - уже true. Так что "bool должна принимать любое число. " правдивое утверждение.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.02.2014, 23:15   #17
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Жаль. Если бы там работала схема, предложенная мной, этим можно было бы объяснить почему не работает программа, когда с прямого ввода задаётся лог. пер. со значениями не 1 и не 0 и работает вариант, предложенный гражданином waleri:
Код:
char ch;
cin >> ch;
exit = ('0' == ch) ? true : false;
Haric_110 вне форума Ответить с цитированием
Старый 11.02.2014, 09:16   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так что "bool должна принимать любое число. " правдивое утверждение.
Покажите мне код, где есть
bool val = 123;
int test = val;
и где test будет 123

Не путайте bool и BOOL.

Цитата:
Сообщение от Haric_110 Посмотреть сообщение
этим можно было бы объяснить почему не работает программа, когда с прямого ввода задаётся лог. пер. со значениями не 1 и не 0
Как отметил Rififi, все будет работать, но только до того, как введете что-то отличное от 0 и 1 - тогда всегда возвращает всегда true а сам cin устанавливается в состояние ошибки.

Последний раз редактировалось waleri; 11.02.2014 в 09:28.
waleri вне форума Ответить с цитированием
Старый 11.02.2014, 09:41   #19
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Пепел Феникса

Вы немного путаете, это в ANSI C нет bool как такового (однако условные операторы считают ноль ложным условием, а все остальное истинным), а в плюсах оно все-таки есть.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 11.02.2014, 12:04   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Пепел Феникса

Вы немного путаете, это в ANSI C нет bool как такового (однако условные операторы считают ноль ложным условием, а все остальное истинным), а в плюсах оно все-таки есть.
я не говорил что нет такого типа в языке, его в данных как-такового не существует, просто особая форма представления байт, потому он и совместим легко с int'ами.
Цитата:
В С++ случай удобный: bool весит 1 байт, 7 младших бит зарезервированы (равны нулю), младший бит принимает два значения 0 - ложь и 1 - истина. Я правильно понял? Я спрашиваю, потому что в начале темы автор сказал(а), что bool должна принимать любое число.
не факт что он весит байт, может и больше(для выравнивания), стандарт этого не требует.
и тип то примет любое число, да, только обратно уже нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с кодом! sid Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 13.04.2010 17:53
помогите разобраться с кодом samosval Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 27.12.2007 00:20
Помогите разобраться с кодом С++ Noor Помощь студентам 20 10.10.2007 17:42