Pergunta

Eu tenho um colega de trabalho que mantém que a verdadeira costumava ser definido como 0 e todos os outros valores eram falsas. Eu poderia jurar que cada língua que eu tenho trabalhado com, se você pode até obter um valor para um booleano, que o valor para FALSE é 0. Fez VERDADEIRO costumava ser 0? Se assim for, quando foi que mudar?

Foi útil?

Solução

O 0 / não-0 coisa que seu colega de trabalho está confuso sobre provavelmente está se referindo quando as pessoas usam valores numéricos como valor de retorno indicando sucesso, não a verdade (ou seja, em bash roteiros e alguns estilos de C / C ++).

Usando 0 = sucesso permite uma precisão maior tanto na especificação causas da falha (por exemplo, 1 = faltando arquivo, 2 = membro amputado, e assim por diante).

Como uma nota lateral: em Ruby, a única falsos valores são nulas e falso. 0 é verdade, mas não ao contrário de outros números. 0 é verdade porque é uma instância do objeto 0.

Outras dicas

Pode ser em referência a um código de resultado de 0 que na maioria dos casos após um processo foi executado, um código de resultado de 0 significava, "Ei, tudo funcionou bem, sem problemas aqui."

Eu trabalhava em uma empresa com uma grande quantidade de código C de idade. Alguns dos cabeçalhos compartilhados definido os seus próprios valores de verdadeiro e falso, e alguns realmente tinha VERDADEIRO como 0 e FALSE como 1. Isso levou a "guerras de verdade":

/* like my constants better */
#undef TRUE
#define TRUE 1

#undef FALSE
#define FALSE 0

Se nada mais, conchas festança ainda usam 0 para a verdade, e 1 para falsa.

Várias funções na biblioteca padrão C retornar um inteiro 'código de erro' como resultado. Desde NOERR é definido como 0, uma verificação rápida pode ser 'se for 0, ele está ok'. A mesma convenção realizada a um processo Unix 'código de resultado'; isto é, um número inteiro que deu algum inidication sobre como um determinado processo terminado.

Em Unix shell script, o código de resultado de um comando executado apenas está disponível, e tipicamente usado para indicar se o comando 'conseguiu' ou não, com 0 significando sucesso, e qualquer outra coisa uma condição não-sucesso específico.

A partir daí, todo o teste-como construções em scripts shell usar 'sucesso' (isto é, um código de resultado de 0) para significar TRUE, e qualquer outra coisa para FALSE média.

Em um avião totalmente diferente, circuitos digitais frecuently usar 'lógica negativa'. isto é, mesmo que 0 volts é chamado de 'binário 0' e algum valor positivo (comumente + 5V ou + 3.3V, mas hoje em dia não é raro usar + 1.8v) é chamado de 'binário 1', alguns eventos são 'afirmou' por um determinado pino vai 0. Eu acho que há algumas vantagens de ruído resistente, mas não tenho certeza sobre as razões.

Note, no entanto, que não há nada de 'antigo' ou algum 'tempo de comutação' sobre isso. Tudo o que eu sei sobre isso é baseado em antigas convenções, mas são hoje totalmente atual e relevante.

Eu não estou certo, mas posso dizer-lhe isto: truques contando com a natureza subjacente de verdadeiro e falso são propensos a erro porque a definição desses valores é deixada para o implementador da linguagem (ou, no muito menos, o especificador).

Sistema chama na biblioteca padrão C tipicamente retornam -1 em caso de erro e 0 em caso de sucesso. Também o Fotran calculado if seria (e provavelmente ainda faz) salto para um dos três números de linha, dependendo do estado avaliando a menor, igual ou maior que zero.

por exemplo: SE (I-15) 10,20,10

iria testar para a condição de que eu == 15 salto para a linha 20, se verdadeiros (avalia a zero) e linha 10 contrário.

Sam está certo sobre os problemas de confiar no conhecimento específico dos detalhes de implementação.

Regra geral:

  1. Escudos (DOS incluído) use "0" como "Não De erro" ... não é necessariamente verdade.

  2. As linguagens de programação usar diferente de zero para denotar verdade.

Dito isto, se você estiver em uma linguagem que permite que o seu definir verdadeiro ou falso, defini-lo e sempre usar as constantes.

Mesmo hoje em dia, em algumas línguas (Ruby, Lisp, ...) 0 é verdade, porque tudo, exceto nil é verdade. Mais frequentemente 1 é verdadeiro. Isso é uma pegadinha comum e por isso às vezes é considerada uma boa prática para não confiar em 0 ser falso, mas para fazer um teste explícito. Java requer que você fazer isso.

Em vez disso

int x;    
....
x = 0;
if (x)  // might be ambiguous
{
}

Make é explícita

if (0 != x)
{
}

Lembro-me de fazer algumas VB programação em um formulário de acesso onde o verdadeiro era -1.

Eu me lembro PL / 1 não tinha classe booleana. Você poderia criar um pouco e atribuir-lhe o resultado de uma expressão booleana. Em seguida, usá-lo, você tinha que lembrar que 1 era falso e 0 era verdade.

Para a maior parte, falsa é definido como 0, e verdadeiro é diferente de zero. Algumas linguagens de programação usar 1, algum uso -1, e alguns usam qualquer valor diferente de zero.

Para os reservatórios Unix, porém, eles usam a convenção oposto.

A maioria dos comandos que são executados em um shell Unix são realmente pequenos programas. Eles passar de volta um código de saída para que você possa determinar se o comando foi bem sucedido (um valor de 0), ou se falhou por algum motivo (1 ou mais, dependendo do tipo de falha).

Este é usado nos sh / ksh / bash intérpretes de shell dentro do if / enquanto / até comandos para verificar as condições:

if command
then
   # successful
fi

Se o comando for bem sucedido (ou seja, retorna um código de saída zero), o código dentro a instrução é executada. Normalmente, o comando que é usado é o [comando, que é um alias para o comando de teste.

O engraçado é que ele depende do idioma você está trabalhando. Em Lua é verdade == de zero interna para o desempenho .. Mesmo para muitos syscalls em C.

É fácil ficar confuso quando verdadeiro / falso declarações de retorno da festança são o contrário:

$ false; echo $?
1
$ true; echo $?
0

Já ouvi falar de e usado compiladores mais antigos, onde true> 0, e false <= 0.

Essa é uma razão que você não quer usar se (ponteiro) ou se (número) para verificar se há zero, eles podem avaliar como false inesperadamente.

Da mesma forma, eu tenho trabalhado em sistemas onde NULL não era zero.

Na linguagem C, antes de C ++, não havia tal coisa como um boolean. Condicionais foram feitas por meio de testes ints. Zero significa falso e qualquer diferente de zero significava verdadeiro. Então, você poderia escrever

if (2) {
  alwaysDoThis();
} else {
  neverDothis();
}

Felizmente C ++ permitido um tipo booleano dedicado.

Em qualquer língua que eu já trabalhei em (voltando ao básico no final dos anos 70), falsa foi considerado 0 e verdadeiro tem sido diferente de zero.

Não me lembro TRUE sendo 0. 0 é algo que um programador C voltaria para indicar sucesso, no entanto. Isso pode ser confundido com TRUE.

Não é sempre 1 quer. Pode ser -1 ou apenas não-zero.

Para idiomas sem construído em um tipo booleano, a única convenção que tenho visto é definir VERDADEIRO como 1 e FALSO como 0. Por exemplo, em C, a declaração if irá executar a cláusula if se os avalia expressão condicional para diferente de 0.

Eu mesmo vi uma vez um diretrizes documento de codificação que disse especificamente não para redefinir TRUE e FALSE. :)

Se você estiver usando uma linguagem que foi construído em um boolean, como C ++, em seguida, palavras-chave true e false fazem parte da língua, e você não deve confiar em como eles são realmente implementadas.

Em linguagens como C não havia valor booleano então você tinha que definir o seu próprio. eles poderiam ter trabalhado em um substituições BOOL não-padrão?

códigos DOS e saída de aplicações geralmente usam 0 para o sucesso média e diferente de zero para falha médio de algum tipo!

códigos de erro DOS são 0-255 e quando testados usando o 'errorlevel' sintaxe nada média acima ou incluindo o valor especificado, então os seguintes jogos 2 e acima para o primeiro Goto, 1 para o segundo e 0 (sucesso) para o final!

IF errorlevel 2 goto CRS
IF errorlevel 1 goto DLR
IF errorlevel 0 goto STR

O SQL Server Database Engine otimiza o armazenamento de colunas bit. Se há 8 ou menos bits colunas numa tabela, as colunas são armazenados como um byte. Se existem, de 9 até 16 bits colunas, as colunas são armazenados como bytes 2, e assim por diante. A seqüência de valores TRUE e FALSE podem ser convertidos em valores de bits: VERDADEIRO é convertido para 1 e FALSE é convertido para 0. Convertendo para pouco promove qualquer valor diferente de zero para 1.

Cada língua pode ter 0 como verdadeiro ou falso Então, pare de usar usar o número de palavras verdadeiras Ri muito Ou t e f 1 armazenamento byte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top