31 Mayıs 2019 Cuma

bool tipi

Bool tipi
C ile kullanılır. Açıklaması şöyle.
C did not originally have a Boolean type, it was added in the 1999 version of the language (C99). At that point, C++ was already standardized (in 1998) to use the type bool, with keywords false and true. To keep the C Boolean type separate from the one in C++, as well as preventing the new name from breaking old C code, it was named _Bool.
bool nerede tanımlı ?
bool eskiden #define kullanılarak tanımlanırdı. Şöyle komik tanımlamalar bile vardı.
#define TRUE  '/'/'/'
#define FALSE '-'-'-'
Yeni derleyiciler bool tipini built-in bir tip olarak işliyorlar.

bool integral bir tiptir
Açıklaması şöyle.
Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively called integral types.
Her integral tip için karşılaştırma işlemi tanımlıdır
Dolayısıyla bool için de aşağıdaki işlemler tanımlıdır.
false < false = false
false < true = true
true < false = false
true < true = false
bool tipinin büyüklüğü belli değildir
Tamamen gerçekleştirime bağlı.
sizeof(char)sizeof(signed char) and sizeof(unsigned char) are 1; the result of sizeof applied to any other fundamental type is implementation-defined. [Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.69)]
Ayrıca bool 1 byte olmak zorunda da değil.
sizeof(bool) is not required to be 1.
Örnek
Şöyle yaparız. Çıktı olarak 1 alırız.
std::cout<<sizeof(!0);
bool ile bit işlemleri yapılmaz
Açıklaması şöyle.
In C++ the bit representation (and even the size) of a bool is implementation defined; generally it's implemented as a char-sized type taking 1 or 0 as possible values.

If you set its value to anything different from the allowed ones (in this specific case by aliasing a bool through a char and modifying its bit representation), you are breaking the rules of the language, so anything can happen. In particular, it's explicitly specified in the standard that a "broken"  bool may behave as both true and false (or neither true nor false) at the same time:
bool int'e çevrilebilir
Açıklaması şöyle. bool zaten integral bir tip olduğu için int'e de rahatlıkla çevrilebilir.
A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true becoming one.
Örnek
bool int'e çevrilebildiği için şöyle yaparız.
bool x = 1;
if (x==1)
    Do something..
Örnek
bool int'e çevrilebildiği için şöyle yaparız.
bool y = 0;
if (y>0.5)
    Do something..
bool'a değer atamak
bool sadece true veya false değerleri veya buna karşılık gelen primitif bir değer yani 1 veya 0 atanabilir. Açıklaması şöyle.
6.2.6 Representations of types
6.2.6.1 General
5 Certain object representations need not represent a value of the object type. If the stored value of an object has such a representation and is read by an lvalue expression that does not have character type, the behavior is undefined. [...]
Çünkü bool derleyici tarafından aşağıdakine benzer bir halde kullanılıyor.
a = 00000000 (false)
!a = 11111111 (true)
Örnek
primitif değer ataması yani 1 veya 0 yapılabilir. Şöyle yaparız
bool x = 1; // x will be true
bool y = 0; // y will be false
bool z = 1; // z will be true
Örnek
a değişkenine 1 veya 0 değeri atanmadığı için if (a) veya if (!a) da olsa hep true çıktısı verir
#include <cstring>
#include <iostream>

bool a;
memset(&a, 0x03, sizeof(bool));
if (a) {
  std::cout << "a is true!" << std::endl;
}
if (!a) {
  std::cout << "!a is true!" << std::endl;
}
Sebebi ise yukarıdaki kodun muhtemelen
a = 00000011 (true)
!a = 11111100 (also true)
şeklinde çalışması

Derleyici
Şu açıklamada bool kullanırken derleyicinin 1 veya 0 olduğunu kontol eden kod ürettiği için girdilerde boolean kullanılmasının çok verimli olmayan kodlara sebep olduğu söyleniyor. Ancak sanırım artık bu açıklama güncel değil.
Boolean variables are stored as 8-bit integers with the value 0 for false and 1 for true. Boolean variables are overdetermined in the sense that all operators that have Boolean variables as input check if the inputs have any other value than 0 or 1, but operators that have Booleans as output can produce no other value than 0 or 1. This makes operations with Boolean variables as input less efficient than necessary.




Hiç yorum yok:

Yorum Gönder