What is the c++ bool type ?

 

The bool type is one of the c++ fundamental data type , a fundamental data type has a cpu hardware mapping .

The bool type is used for boolean values . A boolean value is the result of a relational operation , such as a comparison for equality == , or a logical operation , such as or || .

The result of a boolean operation , can either be true or false , hence C++ introduced the two keywords : true and false . true and false in C++ , are the boolean literals .

The C++ standard specifies , that the bool type , must have the same size , alignment and bit representation , as an unsigned integer type . Typically C++ implementations define the bool type , as having a size of 1 byte , but this is not mandated by the standard .

#include<iostream>

int main(void ){
  std::cout << sizeof(bool ) << " byte ." << std::endl ;
  /*Print the size of the bool type , on 
    this machine . Output : 
    1 byte .*/ }

When performing flow control statements , such as if or while , the conditional expression that is being evaluated , has a resulting type of bool . The only exception is the switch statement , which has a resulting integral type .

Integer types such as int , floating point types such as float, pointers , and enumerations , can be converted to a boolean value , where 0 or the null pointer is false , and everything else is true .

#include<iostream>

int main(void ){
  enum state{halt , run };
  /*Define the enum state , which 
    has two state , halt which is 0 , 
    and run which is 1 .*/

  int var_i = 1 ;
  int *ptr_i = nullptr;

  if(!ptr_i && run )
    /*if ptr_i , is the null pointer ,
      , ptr_i evaluates to false ,
      and not ptr_i evaluates to
      true . 
      run has a value of 1 , as such 
      it evaluates to true . 
      Hence if ptr_is the
      null pointer and the state
      is run , ptr_i is initialized
      with the address of var_i .*/
    ptr_i = &var_i ;

  while(ptr_i && *ptr_i ){
    /*ptr_i evaluates to false ,
      if ptr_i is the null pointer,
      and to true otherwise , *ptr_i
      evaluates to true if different from
      0 , and to false otherwise .
      The while loop will continue , as long
      as ptr_i is not null , and *ptr_i is not
      0 .*/
    std::cout << *ptr_i << std::endl ;
    *ptr_i = *ptr_i - 1 ; }
  /*Output :
    1 .*/ }

When the type of an expression is to be of an integer type , the bool type can be converted to an integer type , where true is promoted , as in integer promotion , to 1 , and false is promoted to 0 .

#include<iostream>

int main(void ){

  switch(true ){
    /*In a switch statement , the conditional
      expression is of an integer type , hence
      true is converted to 1 .*/
    case 0 :
      std::cout << false << " : " << std::boolalpha << false ;
      break;
    case 1 :
      /*When converted to an integer type , true evaluates
        to 1 , and false , to 0 .
        case 1 , is the true case , hence it is the one ,
        that is executed .*/
      std::cout << true << " : "<<std::boolalpha << true <<std::endl;
      /*cout by default prints the integer value
        of a boolean type , so first it will
        print the integer value of true which is 1.
        When passed the option boolalpha , it will
        print the alpha value of the boolean type ,
        hence next it prints true .
        Output :
        1 : true .*/
      break; } }

A class type : class , struct , union , can be evaluated to a boolean if it provides an operator conversion function , and it can perform relational and logical operations , if it provides logical and relational operator functions .

#include<iostream>

class Foo{
  /*Class Foo Definition .*/
  public :
    int var_i;
    bool operator==(const Foo foo );
    bool operator!=(const Foo foo );
    bool operator&&(const Foo foo );
    operator bool( ); };

bool Foo::operator==(const Foo foo ){
  /*Definition of the operator == 
    function , that compares two 
    instances of Foo
    for equality .*/
  return var_i == foo.var_i ;}

bool Foo::operator!=(const Foo foo ){
  /*Definition of the operator != 
    function , which compares two 
    instances of Foo for 
    difference .*/
  return var_i != foo.var_i ;}

bool Foo::operator&&(const Foo foo ){
  /*Definition of operator && 
    function , which implements 
    the and logical operation 
    between two instance of 
    Foo .*/
  switch(var_i - foo.var_i ){
    /*subtract var_i from foo.var_i
      and return false , if the 
      result of the subtraction 
      is 0 , 1 otherwise .*/
    case 0 :
      return false;
    default:
      return true; } }

Foo::operator bool(){
  /*Definition of the operator
    conversion to a bool data 
    type function , which 
    the result of its evaluation
    is a bool type .*/
  switch(var_i ) {
      /*If var_i is equal to 0 , 
        return false , otherwise
        return true .*/
      case 0 :
        return false ;
      default :
        return true; } }


int main(void ){
  /*The main function .*/

  Foo var1_foo{-1 };
  Foo var2_foo{0 };
  /*Define two objects var1_foo ,
    and var2_foo , initializing 
    each to -1 and 0 respectively .*/

  if(var1_foo == var2_foo )
    /*Compare var1_foo and var2_foo for equality .
      var1_foo operator function equal is called ,
      being passed var2_foo as an argument .
      Their var_i data members are not equal , 
      hence the operator function == returns
      false , the body of the if statement 
      is not executed .*/
    std::cout << "var1_foo is equal  var2_foo ." << std::endl ;

  if(var1_foo != var2_foo )
    /*Compare var1_foo and var2_foo for difference .
      The operator function != of var1_foo is called
      , being passed var2_foo as an argument . 
      Their var_i data members are different , 
      hence the result of the operator function 
      != is true , hence the body of the if 
      statement is executed .*/
    std::cout << "var1_foo is different from  var2_foo ." << std::endl ;
    /*Output :
      var1_foo is different from  var2_foo .*/

  if(var1_foo )
    /*var1_foo is evaluated as a boolean , 
      since the destination type for an
      if statement is a boolean type .
      var1_foo is converted to a boolean , 
      by calling its operator conversion 
      function bool , which switches 
      the var_i data member , and return 
      true if its different from 0 , 
      false otherwise .*/
    std::cout << "var1_foo is true ." << std::endl ;
    /*Output :
      var1_foo is true .*/

  if(!var2_foo )
    /*var2_foo is evaluated as a boolean , 
      hence it is converted to a boolean ,   
      since the destination type of an
      if statement is the bool type .
      var2_foo conversion operator function  
      bool is called , and it returns a 
      bool , which is true if the 
      var_i data member is different from 
      0 , and false otherwise .*/
    std::cout << "var2_foo is false ." << std::endl ;
    /*Output :
      var2_foo is false .*/

  if(var2_foo && var1_foo )
    /*var2_foo operator function && is 
      called , it is passed var1_foo 
      as an argument .
      The operator function && subtract
      var2_foo var_i data member from 
      var1_foo var_i data member : 
      0 - (-1 ) is equal
      to 1 , hence the operator function
      && returns a true , as such the 
      body of the if statement is executed .*/
    std::cout<< "var1_foo && var2_foo is true ." <<std::endl; 
    /*Output :
      var1_foo && var2_foo is true .*/ }

The bool type can be used as the return type of predicate functions , these are functions which must return either true or false .

bool isCppStandard_Compliant(){
  return true ;}