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

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

26.04.2010, 02:58. Показов 145896. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,025
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,025
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
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,025
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
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,025
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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru