Essa pergunta pode parecer idiota, mas por que 0avalia falsee qualquer outro valor [inteiro] para a truemaioria 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 0avalia truee 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 strcmpcomo 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 strcmpretornos 0que avaliam falsequando 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 0avaliado 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 -1e 1teriam 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, 0e 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 comparefunçã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 0sido 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 0quando 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,, 0para 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 é yesavaliado falseem uma ifcondição, enquanto todos os nocasos 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 0avaliado truee o resto falseteria feito muito mais sentido.
Conclusão
Minha conclusão é essencialmente minha pergunta original: por que projetamos linguagens onde 0estão falsee 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 trueestá um comando que retorna zero e indica ifpara executar ....
booltipo, 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.