Fórum Boolean nem true nem false #277685
18/04/2005
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var a,b:Boolean; Baiti:Byte; begin a := true; Baiti := 2; Move(Baiti, b, 1); if a and b then ShowMessage(´b é true´) else if a and not b then ShowMessage(´b é false´) else if a then ShowMessage(´b é ?´); end; |

Kapak
Curtir tópico
+ 0Posts
18/04/2005
Beppe
Caso 2) Em certas ocasiões, trata qualquer valor diferente de 0 como True.
Mas no caso dos operadores [b:df697bf3a3]and[/b:df697bf3a3], [b:df697bf3a3]or[/b:df697bf3a3] e [b:df697bf3a3]xor[/b:df697bf3a3], o procedimento é o mesmo dos inteiros. E sem olhar o código gerado, pode ser um tanto difícil adivinhar o que será feito.
O [b:df697bf3a3]not [/b:df697bf3a3]tem um tratamento especial em alguns casos. Dentro de um [b:df697bf3a3]if [/b:df697bf3a3]é o Caso 2. Numa atribuição, é o Caso 1.
Atribuição simples:
a and b = 01b and 10b = 0 = False
not b = 10b xor 01b = 11b = True
Teste if ou atribuição complexa:
a and b = 01b and 10b = 0 = False
a and not b = (01b <> 00b) and not (10b <> 00b) = 01b and not 01b = 01b and 00b = 00b = True
O problema é o Move. Use b := Baiti <> 0;
PS: o sufixo b é de binário
Gostei + 0
18/04/2005
Massuda
1 2 | type Boolean = (False, True); |
Quando você faz...
1 2 3 4 | Baiti := 2; Move(Baiti, b, 1); // ou simplesmente // b = Boolean(2) |
Delphi avalia uma variável Boolean no estilo da linguagem C, ou seja, falso é ZERO e verdadeiro é NÃO-ZERO; assim
1 2 3 4 5 6 | b := Boolean(2); if b then {sempre executado} else {nunca executado} |
O problema são os operadores lógicos...
Os operadores lógicos AND, OR e XOR tratam os booleans como inteiros, de modo que o AND, OR e XOR são feitos bit-a-bit.
1 2 3 4 5 6 7 8 9 10 11 12 | a := True; b := Boolean(2); if b then {sempre executado} else {nunca executado} if a and b then // = 1 and 2 = 0 {nunca executado} else {sempre executado} |
O operador lógico NOT é implementado como sendo:
1 | Not X = Boolean(Byte(X) Xor Ord(True)) |
1 2 3 | b := Boolean(8); b := Not b; // Byte(b) = 9 |
No caso, ao avaliar a expressão lógica nos if´s, cada parte da expressão é avaliada conforme o operador lógico utilizado e no final verifica se o resultado é ou não zero.
Lembro que no Pascal original, True = 0 e False = -1 (ou o contrário, não lembro), mas isso foi alterado nas primeiras versões do Delphi (quando surgiu o C++ Builder, acho).
Gostei + 0
18/04/2005
Marco Salles
Massuda :
Massuda :
Gostei + 0
18/04/2005
Aroldo Zanela
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | {$B+} procedure TForm1.Button1Click(Sender: TObject); var a:Boolean; b:Boolean; Baiti:Byte; begin a := true; Baiti := 2; Move(Baiti, b, SizeOf(Baiti)); if a and b then ShowMessage(´b é true´) else if a and not b then ShowMessage(´b é false´) else ShowMessage(´b é ´+IntToStr(Integer(b))); end; |
Gostei + 0
18/04/2005
Kapak
1 2 3 | {$B-} if a and (b) then ShowMessage(´b é true´) // e é aqui que ele vem |
Gostei + 0
18/04/2005
Kapak
Gostei + 0
18/04/2005
Massuda
1 | if a and b then... |
1 | if Boolean(Integer(a) and Integer(b)) then... |
Com relação a outra questão...
1 2 3 | {$B-} if a and (b) then ShowMessage(´b é true´) // e é aqui que ele vem |
No seu exemplo, a é sempre True, logo o compilador precisa apenas checar o valor de b, para saber se o AND é verdadeiro; como ele não precisa fazer o AND, ele apenas testa se B é não-zero, o que resulta em True.
Note que se o teste usasse OR ao invés de AND, o compilador nem precisava testar o valor de b, pois a já é True.
Gostei + 0
18/04/2005
Kapak
1 2 3 | $B-} if a and b then // Resulta em false if a and (b) then // Resulta em true |
Gostei + 0
18/04/2005
Massuda
1 2 | if a and b then // Resulta em false if a and (b) then // Resulta em true |
No primeiro caso, o compilador faz o AND entre a e b e acabou.
1 | if (Integer(a) and Integer(b)) <> 0 then... |
No segundo caso, o compilador avalia cada lado do AND separadamente, gerando um código mais ou menos assim
1 2 | if Integer(a) <> 0 then if Integer(b) <> 0 then... |
Sinceramente, num primeiro momento eu acharia que é um bug do compilador, mas como a causa disso é um valor fora de faixa, eu acho aceitável que quem fez o compilador diga que isso é um comportamento indefinido.
Gostei + 0
18/04/2005
Kapak
Gostei + 0
18/04/2005
Massuda
Gostei + 0
18/04/2005
Kapak
1 2 | if Integer(a) <> 0 then if Integer(b) <> 0 then... |
Gostei + 0
18/04/2005
Anderson_blumenau
tipo
0 eh falso
1 eh verdadeiro
1 2 3 4 5 6 7 | A and B 0 0 = 0 falso 1 0 = 0 falso 1 1 = 1 verdadeiro Definicao: A saida eh verdade se somente todas as entradas forem verdade |
Gostei + 0
18/04/2005
Beppe
Isso em condições normais. No caso do [b:bedb633d4e]kapak[/b:bedb633d4e], o código que ele usa depende de como o compilador interpreta em cada caso. Reitero que iso não deve ser usado(Move´s e typecast´s), já que torna o código menos legível e difícil de manter.
Gostei + 0
18/04/2005
Kapak
Como vc faria ?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)