Сравнение типов данных bool в C ++ - PullRequest
15 голосов
/ 20 мая 2019

Тип данных bool обычно представлен как 0 (как false) и 1 (как true). Однако некоторые говорят, что значения true могут быть представлены значениями, отличными от 1. Если последующее утверждение true, то следующее выражение может быть неверным.

bool x = 1;
if (x==1)
    Do something..

Мне интересно, будут ли следующие операторы работать как обычно и ожидаемо на часто используемых компиляторах.

  1. bool x = 1;
    if (x==1)
        Do something.
    
  2. bool y = 0;
    if (y>0.5)
        Do something..
    
  3. bool z = 1;
    if(z>0.5)
        Do something...
    

Ответы [ 4 ]

13 голосов
/ 20 мая 2019

§4.5 C ++ стандарта говорит:

Значение типа bool может быть преобразован в значение типа int, с ложным становится ноль и правда стать одним.

в отношении 2 и 3, преобразование типов происходит так, что операторы будут работать как нужно

9 голосов
/ 20 мая 2019

В соответствии с правилом Булевых преобразований :

Может быть преобразовано значение целого, перечисления с плавающей точкой, перечисления с незаданной областью, указателя и указателя на член.к значению типа bool.

Нулевое значение (для целочисленного значения, перечисления с плавающей точкой и перечисления с незаданной областью), а также нулевой указатель и нулевые значения указателя на элемент становятся false.Все остальные значения становятся true.

Тогда

bool x = 1; // x will be true
bool y = 0; // y will be false
bool z = 1; // z will be true

Для 1-го случая, if (x==1), x будет повышен до int,

тип bool может быть преобразован в int со значением false, становящимся 0, и true, становящимся 1.

затем (x==1) равно true.

Для второго случая if (y>0.5), y будет преобразовано в int со значением 0, затем преобразовано *От 1043 * до double для сравнения ;

Если операнды имеют арифметический или перечислимый тип (с областью или без области), обычные арифметические преобразования выполняются для обоих операндов в соответствии с правилами для арифметических операторов.Значения сравниваются после преобразования:

и

Если операнд, переданный арифметическому оператору, является типом перечисления с целым числом или с незаданной областью, то перед любым другим действием (но после lvalueпреобразование-в-значение, если применимо), операнд подвергается интегральному продвижению.

...

  • В противном случае, если один из операндов равен double, другой операнд преобразуется вdouble

, тогда y>0.5 равно false.

В третьем случае if (z>0.5), z будет преобразовано в int со значением 1, затем преобразовано в double для сравнения ;тогда z>0.5 равно true.

6 голосов
/ 20 мая 2019

if (x==1) не является неправильным.Все представления истинных значений преобразуются в 1 при преобразовании логического значения в числовой тип.

Если задано bool z=true, if(z>0.5) будет истинным, поскольку 1,0 больше 0,5.

4 голосов
/ 20 мая 2019

bool имеет только два значения, и они true и false.1 и 0 являются целочисленными литералами, поэтому они могут быть преобразованы в bool.Необходимо учитывать, что преобразование работает в обоих направлениях, но вы не обязательно получите одно и то же целое число:

int a = 5;
bool b = a; // int -> bool conversion
int c = b;  // bool -> int conversion
std::cout << a << " " c;

печатает:

5 1

Любое целое значение, отличное от 0 конвертируется в true, но true всегда конвертируется в 1.

Учитывая это, все ваши примеры будут работать, как и ожидалось.Однако обратите внимание, что основная цель bool заключается в том, что мы можем использовать true и false в нашем коде вместо того, чтобы указывать числа как 0 и 1 специального значения.Всегда лучше быть явным, поэтому, когда вы имеете в виду true, лучше написать true, а не 1.

...