Essa pergunta pode parecer idiota, mas por que 0
avalia false
e qualquer outro valor [inteiro] para a true
maioria das linguagens de programação?
Comparação de strings
Como a pergunta parece um pouco simples demais, vou me explicar um pouco mais: antes de tudo, pode parecer evidente para qualquer programador, mas por que não haveria uma linguagem de programação - pode realmente haver, mas não nenhuma Eu usei - para onde 0
avalia true
e todos os outros valores [inteiros] para false
? Essa observação pode parecer aleatória, mas tenho alguns exemplos em que pode ter sido uma boa ideia. Primeiro de tudo, vamos dar o exemplo de comparação tríplice de strings, vou usar C strcmp
como exemplo: qualquer programador que tente C como sua primeira língua pode ser tentado a escrever o seguinte código:
if (strcmp(str1, str2)) { // Do something... }
Como strcmp
retornos 0
que avaliam false
quando as strings são iguais, o que o programador iniciante tentou fazer falha miseravelmente e ele geralmente não entende o porquê. Em vez disso, se tivesse 0
avaliado true
, essa função poderia ter sido usada em sua expressão mais simples - a acima - ao comparar a igualdade, e as verificações apropriadas -1
e 1
teriam sido realizadas somente quando necessário. Teríamos considerado o tipo de retorno como bool
(na minha opinião, quero dizer) na maioria das vezes.
Além disso, vamos apresentar um novo tipo sign
,, que apenas aceita valores -1
, 0
e 1
. Isso pode ser bastante útil. Imagine que existe um operador de espaçonave em C ++ e queremos isso std::string
(bem, já existe a compare
função, mas o operador de espaçonave é mais divertido). A declaração seria atualmente a seguinte:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Se tivesse 0
sido avaliado true
, o operador da nave espacial nem existiria, e poderíamos ter declarado operator==
assim:
sign operator==(const std::string& lhs, const std::string& rhs);
Isso operator==
teria tratado a comparação de três maneiras ao mesmo tempo e ainda poderia ser usado para executar a verificação a seguir, enquanto ainda é possível verificar qual sequência é lexicograficamente superior à outra quando necessário:
if (str1 == str2) { // Do something... }
Tratamento de erros antigos
Agora temos exceções, portanto essa parte se aplica apenas aos idiomas antigos onde não existe (C por exemplo). Se olharmos para a biblioteca padrão de C (e também para a POSIX), podemos ver com certeza que muitas funções retornam 0
quando bem-sucedidas e qualquer número inteiro caso contrário. Infelizmente, tenho visto algumas pessoas fazerem esse tipo de coisa:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Se pensarmos em como pensamos em programação, geralmente temos o seguinte padrão de raciocínio:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Se pensarmos sobre isso de novo, teria sentido colocar o único valor neutro,, 0
para yes
(e é assim que as funções de C funcionam), enquanto todos os outros valores podem estar lá para resolver os muitos casos do no
. No entanto, em todas as linguagens de programação que conheço (exceto talvez algumas linguagens esotéricas experimentais), isso é yes
avaliado false
em uma if
condição, enquanto todos os no
casos são avaliados em true
. Existem muitas situações em que "funciona" representa um caso, enquanto "não funciona" representa muitas causas prováveis. Se pensarmos dessa maneira, ter 0
avaliado true
e o resto false
teria feito muito mais sentido.
Conclusão
Minha conclusão é essencialmente minha pergunta original: por que projetamos linguagens onde 0
estão false
e outros valores true
, levando em conta meus poucos exemplos acima e talvez mais alguns em que eu não pensava?
Acompanhamento: É bom ver que existem muitas respostas com muitas idéias e o maior número possível de razões para que seja assim. Eu amo como você parece apaixonado por isso. Eu originalmente fiz essa pergunta por tédio, mas como você parece tão apaixonado, decidi ir um pouco mais longe e perguntar sobre a lógica por trás da escolha booleana de 0 e 1 em Math.SE :)
if true ; then ... ; fi
, onde true
está um comando que retorna zero e indica if
para executar ...
.
bool
tipo, mas comparações / se as condições etc. pode ter qualquer valor de retorno.
strcmp()
não é um bom exemplo para true ou false, pois retorna 3 valores diferentes. E você ficará surpreso quando começar a usar um shell, onde 0 significa verdadeiro e qualquer outra coisa significa falso.