Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/762: Рейтинг темы: голосов - 762, средняя оценка - 4.63
 Аватар для alfer
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 38

Тип bool, для чего нужен, как работает?

26.04.2010, 02:58. Показов 146022. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может кто-нибудь поможет на простейшем но понятном примере объяснить как работает тип bool. Знаю что это тип может быть ложный или истинный но что-то никак его работу не могу понять.... для чего он нужен...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.04.2010, 02:58
Ответы с готовыми решениями:

Как работает и для чего нужен maven offline mode?
Отсюда: Вопрос mvn clean install по умолчанию разве проверяет обновления плагинов и зависимостей(без наличия Versions maven...

Для чего нужен тип void?
для чего нужна функция void

Что обозначает тип интерфейса и для чего он нужен?
До меня всё никак докатить не может, что вообще обозначает переменная с типом интерфейс(например, ICar<V8Engine>, это же тип, я...

30
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
21.10.2017, 09:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
if, while и прочие просто принимают любой численный тип
Они работаю с чем-то, что может конвертироваться в bool.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
где оно в ассемблерном коде?
А где здесь ассемблерный код?
Здесь код C++.
Иначе по Вашей логике можно сказать,
C++
1
2
3
4
int sq(int n)
{
   return n * n;
}
что функции sq не существует,
компилятор же её заинлайнил в результате.
Мы здесь говорим о C++, а не о ассемблере.
В конце концов, int'ов, char'ов и т.д. тоже не существует.
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
21.10.2017, 11:39
Цитата Сообщение от Croessmah Посмотреть сообщение
Они работаю с чем-то, что может конвертироваться в bool.
Может скажете что математические операторы (+, -, *, /) тоже конвертируют в bool? Или все-таки принимают данные любых численных типов?
Цитата Сообщение от Croessmah Посмотреть сообщение
А где здесь ассемблерный код?
Преобразование, явное или неявное это все-таки преобразование. При преобразовании char->int переменная копируется в регистр подходящего размера и старшие биты зануляются (или заполняются единицами для отрицательных чисел). При преобразовании int->float преобразование еще более хитрое. Даже явное преобразование int->bool выглядит примерно как (x==0?1:0) Все это прекрасно видно в дизассемблерном коде. Где что-то подобное для операторов условий?
Цитата Сообщение от Croessmah Посмотреть сообщение
Иначе по Вашей логике можно сказать,
что функции sq не существует,
Вот же она (компиляция с -Os)
Assembler
1
2
3
4
5
6
00000000000006ea <sq>:
   return n * n;
 6ea:   0f af ff                imul   %edi,%edi
}
 6ed:   89 f8                   mov    %edi,%eax
 6ef:   c3                      retq
Если принудительно объявить inline
Assembler
1
 5c4:   0f af f6                imul   %esi,%esi
То есть видно, что задача функции выполняется, для нее сгенерирован код.
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
21.10.2017, 12:28
Просто оставлю это здесь. Ни с кем не спорю, ни за кого не вступаюсь.

Цитата Сообщение от 6.4.1 The if statement
1 If the condition yields true the first substatement is executed. If the else part of the selection statement is present and the condition yields false, the second substatement is executed.
Цитата Сообщение от 6.4.1 The if statement
2 If the if statement is of the form if constexpr, the value of the condition shall be a contextually converted constant expression of type bool;
while ( condition ) statement
do statement while ( expression ) ;

Цитата Сообщение от 6.5.1 The while statement
1 In the while statement the substatement is executed repeatedly until the value of the condition becomes false.
Цитата Сообщение от 6.5.2 The do statement
1 The expression is contextually converted to bool;
( Жирным выделено Стандартом )

Тема спорная, однако явно видно, что Стандарт использует такие речевые обороты:
If the condition yields true...
... becomes false...
Иногда даже прямо говорит, что:
... converted to bool;
... of type bool;
Он не говорит что-то вроде этого:
... if a condition is not 0...

Тут конкретно:
Цитата Сообщение от 5.9 Relational operators
1 The operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) all yield false or true. The type of the result is bool.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
21.10.2017, 12:51
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Может скажете что математические операторы (+, -, *, /) тоже конвертируют в bool? Или все-таки принимают данные любых численных типов?
Тёплое с мягким, здрасть.
От Вас другого и не ждал.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Преобразование, явное или неявное это все-таки преобразование.
Ога. И если его нельзя произвести - ошибка.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При преобразовании char->int переменная копируется в регистр подходящего размера
В C++ нет регистров.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Все это прекрасно видно в дизассемблерном коде.
Там не действует семантика C++.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Где что-то подобное для операторов условий?
Нет никаких операторов условий.
Ваш ассемблер - ложь лживая.
Всё есть не более чем электрические импульсы.
Суть Ваших изречений ясна?
Не надо путать языки между собой.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот же она (компиляция с -Os)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstdio>
 
namespace {
    int sq(int n)
    {
    return n * n;
    }
}
 
 
int main()
{
    printf("%d", sq(10));
}
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
main: # @main
  push rax
  mov edi, .L.str
  mov esi, 100
  xor eax, eax
  call printf
  xor eax, eax
  pop rcx
  ret
 
.L.str:
  .asciz "%d"
https://godbolt.org/g/pH9uXc

Функции sq не существует.
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
21.10.2017, 15:35
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Иногда даже прямо говорит, что:
... converted to bool;
Где оно, это преобразование?
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Тут конкретно:
Тут говорится об операторах сравнения, а не операторах ветвления.
Цитата Сообщение от Croessmah Посмотреть сообщение
Тёплое с мягким, здрасть.
От Вас другого и не ждал.
...
Ога. И если его нельзя произвести - ошибка.
Внезапно, если нельзя привести аргументы арифметических операторов к bool - тоже ошибка. Просто потому что bool - численный тип, а арифметические операторы и условия принимают именно их. Какое совпадение.
Цитата Сообщение от Croessmah Посмотреть сообщение
В C++ нет регистров.
...
Там не действует семантика C++.
Приведение типов осуществляется не на уровне языка - там определяется только возможность (проверка синтаксиса). Примеры я привел.
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет никаких операторов условий.
Хорошо, как тогда вы назовете обобщение операторов if, for, while, ? ? Или вы настолько неуверены в своем мнении что готовы уводить тему в обсуждение терминологии?
Цитата Сообщение от Croessmah Посмотреть сообщение
Ваш ассемблер - ложь лживая.
Хотите разбираться в машинных кодах вместо их мнемонического представления? Месье знает толк...
Цитата Сообщение от Croessmah Посмотреть сообщение
Не надо путать языки между собой.
При чем здесь язык если речь идет о приведении типов? А тип определяется не языком, а моделью представления данных. Язык лишь дает им названия. К примеру, 2-байтное число в дополнительном коде в Си называется int16_t, а в Паскале - word. При том что это одно и то же число, и приведения типов осуществляются одинаково.
Цитата Сообщение от Croessmah Посмотреть сообщение
Функции sq не существует.
Угу, когда оптимизатор ее не просто заинлайнил, а вычислил на этапе компиляции. Объявите ее доступной извне (gcc, похоже, делает это по умолчанию) и удивитесь результату. Еще бы макрос в качестве примера привели
C
1
2
#define sq(x) ((x)*(x))
printf("%i\n",sq(10));
Куда же в исполняемом коде делся sq, магия наверное?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int main (void){
 5a0:   48 83 ec 18             sub    $0x18,%rsp
  volatile int x;
  volatile bool y;
  scanf("%i", &x); //volatile и ручной ввод чтобы оптимизатор не мешался
 5a4:   48 8d 3d e9 01 00 00    lea    0x1e9(%rip),%rdi        # 794 <_IO_stdin_used+0x4>
 5ab:   31 c0                   xor    %eax,%eax
 5ad:   48 8d 74 24 0c          lea    0xc(%rsp),%rsi
 5b2:   e8 c9 ff ff ff          callq  580 <scanf@plt>
  if(x)printf("true\n");
 5b7:   8b 44 24 0c             mov    0xc(%rsp),%eax
 
//----  Вот проверка без приведения типов ------
 5bb:   85 c0                   test   %eax,%eax
//-------------------------------------------------------------------
 
 5bd:   74 0c                   je     5cb <main+0x2b>
 5bf:   48 8d 3d d1 01 00 00    lea    0x1d1(%rip),%rdi        # 797 <_IO_stdin_used+0x7>
 5c6:   e8 a5 ff ff ff          callq  570 <puts@plt>
  x++;
 5cb:   8b 44 24 0c             mov    0xc(%rsp),%eax
 5cf:   ff c0                   inc    %eax
 5d1:   89 44 24 0c             mov    %eax,0xc(%rsp)
  y = x;
 5d5:   8b 44 24 0c             mov    0xc(%rsp),%eax
 
//----- А вот неявное приведение типов
 5d9:   85 c0                   test   %eax,%eax
 5db:   0f 95 c0                setne  %al
//-------------------------------------------------------
 
 5de:   88 44 24 0b             mov    %al,0xb(%rsp)
  if(y)printf("true\n");
 5e2:   8a 44 24 0b             mov    0xb(%rsp),%al
 5e6:   84 c0                   test   %al,%al
 5e8:   74 0c                   je     5f6 <main+0x56>
 5ea:   48 8d 3d a6 01 00 00    lea    0x1a6(%rip),%rdi        # 797 <_IO_stdin_used+0x7>
 5f1:   e8 7a ff ff ff          callq  570 <puts@plt>
}
Разница понятна?

Добавлено через 2 часа 4 минуты
P.S. Croessmah, ты серьезно думаешь, что засирание кармы - аргумент в споре?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.10.2017, 19:26
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Где оно, это преобразование?
Во флагах процессора. Если вам так уж охота обсуждать реализацию if на уровне процессора, то операторы условного перехода проверяют отдельные биты регистра флагов, а не то, чему там равны int/double/void*-переменные.
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
21.10.2017, 22:09
Renji, это уже зависит от реализации. К примеру в микроконтроллерах AVR достаточно часто встречается конструкция if( var & (1<<x) ){...}, которая разворачивается в sbrc var, x (проверка x-того бита в регистре var). То есть проверяется не "регистр флагов", а обычный РОН. По существу же, (не)явное преобразование подразумевает сначала вычисление значения нужного типа, в данном случае - сведение к 0/1, а потом использование именно его. Конечно, это можно списать на оптимизацию, но проще - признать if (и подобные) обычными операторами, принимающими численные аргументы. Впрочем, все это - вопрос терминологии.
Предлагаю такую формулировку: операторы ветвления воспринимают аргумент как логическое значение. Сам аргумент может не быть логическим значением, и физического приведения типов может не быть. Причем эта формулировка не противоречит оригиналу.
0
21.10.2017, 22:49

Не по теме:

Цитата Сообщение от Captain Maxee Посмотреть сообщение
( Жирным выделено Стандартом )
В стандарте простой моноширинный шрифт. http://cdn.imgpaste.net/2017/10/22/epBQN.png

Миниатюры
Тип bool, для чего нужен, как работает?  
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
25.10.2017, 17:43
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
По существу же, (не)явное преобразование подразумевает сначала вычисление значения нужного типа, в данном случае - сведение к 0/1, а потом использование именно его.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Сам аргумент может не быть логическим значением, и физического приведения типов может не быть
А вызов функции по существу подразумевает физическую генерацию инструкции call (или подобной), иначе это не вызов функции?
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
25.10.2017, 22:11
Вызов - да. Но есть еще макросы и inline функции, которые подразумевают встраивание непосредственно в вызывающий код.
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
26.10.2017, 10:33
Цитата Сообщение от alfer Посмотреть сообщение
Знаю что это тип может быть ложный или истинный но что-то никак его работу не могу понять.... для чего он нужен...
чтобы хранить там значение true либо false

Цитата Сообщение от alfer Посмотреть сообщение
Может кто-нибудь поможет на простейшем но понятном примере объяснить как работает тип bool.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    bool isHappy = false;
 
    if(isHappy)
        std::cout << "Hello World :)";
    else
        std::cout << "Hello World :(";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2017, 10:33

Что за тип файла xlm - и для чего он нужен
У меня есть такой вопрос - теоретического свойства. Зачем нужно сохранять xls в xlm? Такой формат файла можно выбрать при...

как правильно понять тип bool ? bool true(const string &str) и что дает это значение ?
задам может глупый вопрос, но прошу ответить. как правильно понять тип bool ? bool true(const string &amp;str) и что дает это...

Для чего нужен возвращаемый тип в перегрузке ввода >> и почему без него него выдаётся ошибка?
Для чего нужен возвращаемый тип в перегрузке ввода &gt;&gt;, какую роль он выполняет что без него него выдаётся ошибка. cin объект istream...

Для чего нужен Seed() и для чего его override?
Привет, ребята. Прочитал много разных статей про Seed(). И так и не могу понять зачем он нужен на практике. Вот выдержка одной из...

Для чего нужен С/С++ и как ним пользоваться?
Для чего С/С++ и как ним пользоваться? Просветите меня пожалуйста, я в компах не плохо разбираюсь, но в программировании я ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru