Tivemos uma tarefa para a nossa turma, na qual tivemos que criar um jogo Tic-tac-toe . As pessoas gostam de se complicar, então criaram jogos complexos que incluíam menus. No final do jogo, você tinha a opção de jogar novamente ou sair do programa. Eu usei umint
variável para isso, mas notei alguns colegas usando BOOLs.
É mais eficiente? Qual é a diferença, entre armazenar uma resposta que deve armazenar apenas dois valores em int
vez de armazená-la em um bool? Qual é o objetivo exato dessas variáveis?
int
é armazenar um número inteiro e o objetivo de umbool
é armazenar um valor booleano (true
oufalse
). Usar umbool
IMO reflete seu uso muito melhor do que usar umint
.typedef int Bool
deixar claro que estavam usando um booleano. O C ++ integrou o suportebool
à linguagem, assim como o C99 com a_Bool
palavra-chave (bastante feia) .bool
", é por que temos nomes diferentes para tipos semelhantes (comolength_t
) e por que é importante que o compilador verifique os tipos.Respostas:
Ao escolher tipos e nomes de variáveis, você deseja que sua intenção seja a mais clara possível. Se você escolher um
bool
tipo (booleano), ficará claro que existem apenas dois valores aceitáveis:true
oufalse
. Se você usar umint
tipo (inteiro), não ficará mais claro que a intenção dessa variável pode ser apenas 1 ou 0 ou quaisquer valores que você escolheu para significartrue
efalse
. O Plussizeof(int)
normalmente retornará como sendo 4 bytes, enquantosizeof(bool)
retornará 1.fonte
Parece que em todas as respostas (até agora) coletadas, ninguém percebeu o fato de o OP ter falado sobre
BOOL
nãobool
.Como a pergunta está marcada como C ++, deve-se notar que:
int
é um número inteiro que varia deINT_MIN
aINT_MAX
- macros definidas em<climits>
cujos valores dependem da arquitectura da máquina hospedeira. Em C ++, esses valores também são acessíveis comostd::numeric_limits<int>::min()
e...:max()
respectivamente). O comportamento dos operadores booleanos aplicado paraint
tratar0
como falso e todo o resto como verdadeiro .BOOL
é apenas uma dica sugerindo um comportamento booleano para um int. É definido<cstddef>
comoBOOL
não é nada além de açúcar sintático; para o que, pelo compilador, nada mais é que um int. É algo que o programador C usa, mas os programadores C ++ devem evitar, já que o C ++ o possuibool
.bool
é um tipo de idioma integral cujos valores suportados são justostrue
efalse
. Quando convertido emint
true
se torna 1 efalse
se torna 0.O aspecto importante é que é mais seguro contra erros de programação:
é impossível codificar com o tipo bool apropriado:
Usar em
BOOL
vez debool
é apenas um mau hábito herdado de um passado glorioso que ninguém ainda é capaz de esquecer, criando assim um problema antigo para um amanhã menos glorioso.Os professores de idiomas devem pensar seriamente sobre isso!
fonte
Os tipos booleanos são menores que os tipos Int, portanto, usam menos espaço na memória. Dependendo do sistema em que você está compilando, um Int pode ter de 4 a 8 bytes, enquanto um Bool é de 1 byte (como pode ser visto neste artigo do MSDN )
Junte isso a alguns dos aspectos do KISS e ao bom design do programa, e fica óbvio por que é melhor usar um bool para armazenar uma variável que terá apenas dois valores.
Por que complicar demais as coisas com um objeto que pode armazenar uma ampla gama de valores, quando você tem certeza de que só precisa armazenar 1 de 2 valores diferentes?
O que acontece no sistema que usa um int, se você armazenar 75 lá? Se você adicionou condicionais extras
ou
então você está coberto para esta situação. Mas se você não tiver, então você não é.
Você também pode ter um caso (dependendo de como está alterando o valor do int) em que há uma saturação de buffer e o valor "redefine" de volta para 0 ou o limite inferior do seu int (que pode estar em algum lugar no região de -127 a −9,223,372,036,854,775,808, dependendo da arquitetura de destino ) o que acontece no seu código?
No entanto, se você usasse um bool, poderia usar algo como isto:
Ou até:
ou até:
Dependendo do seu compilador, pode haver otimizações que ele pode executar no código que usa Bools para armazenar valores true / false mapeados. Enquanto isso, pode não haver otimizações que ele possa executar para o Ints usado para armazenar valores true / false mapeados.
Também devemos lembrar que o C ++ (junto com C, Assembly e FORTRAN) é usado para escrever código altamente eficiente, pequeno e rápido. Portanto, seria melhor usar um Bool neste caso - especialmente se você estiver sendo marcado no uso de variáveis, memória, cache ou tempo do processador.
Uma pergunta semelhante seria: por que eu armazenaria um número inteiro (valor) em um float? Resposta: Você não deveria, porque não faz sentido.
Para encurtar a história: como seu professor / tutor / professor / professor deve examinar com você os tamanhos de diferentes tipos de valores (caso você tenha perdido) e por que eles são importantes no desenvolvimento de software.
Espero que ajude como ponto de partida (também espero que não pareça pedante)
fonte
return value >= 0;
para o primeiro exemplo.O objetivo aqui é a clareza de intenção. O tipo de retorno faz parte de uma interface de funções e a
bool
informa mais sobre o que esperar da função do que umint
.Even
BOOL
é mais expressivo do queint
, mesmo sendo do mesmo tipo, pelo menos mostra sua intenção.No entanto, nenhum deles é o que eu recomendaria:
fonte
Na programação, você deseja representar algo da vida real no código. Apesar de um int e um bool fazerem o mesmo, a ideia do subyacent é completamente diferente: ao usar um bool, a resposta pode ser sim ou não; e isso é tudo, essa é a intenção. Com números inteiros, você pode representar quantidades sem ponto decimal. E nesse mesmo espírito, por que você escolheria um número inteiro quando um duplo pode fazer o mesmo? Se um número inteiro fizer mais sentido do que um dobro ao modelar o problema, você poderá escolher um int.
fonte
Porque no final, você converterá seu número inteiro para um booleano de qualquer maneira: "se (i = 1), então jogue outro jogo". Nesta situação (i = 1) é convertido em verdadeiro ou falso: um booleano.
fonte
if (i = 1)
é provavelmente a coisa muito errada a ter no código de alguém.