Simples pergunta realmente; existe uma diferença entre esses valores (e existe uma diferença entre BOOL e bool)? Um colega de trabalho mencionou que eles avaliam coisas diferentes no Objective-C, mas quando observei os typedefs em seus respectivos arquivos .h, YES / TRUE / true foram todos definidos como 1
e NO / FALSE / false foram definidos como 0
. Existe realmente alguma diferença?
objective-c
boolean
Kevlar
fonte
fonte
Respostas:
Não há diferença prática, desde que você use
BOOL
variáveis como booleanos. C processa expressões booleanas com base na avaliação de 0 ou não de 0. Portanto:significa o mesmo que
é por isso que você pode avaliar qualquer tipo ou expressão primitiva como um teste booleano (incluindo, por exemplo, ponteiros). Note que você deve fazer o primeiro, não o último.
Note que não é uma diferença se você atribuir valores obtusos a um chamado
BOOL
variável e teste para valores específicos, por isso sempre usá-los como booleans e só atribuí-los a partir de seus#define
valores.Importante, nunca teste booleanos usando uma comparação de caracteres - não é apenas arriscado, porque
someVar
pode ser atribuído um valor diferente de zero que não é SIM, mas, na minha opinião, o mais importante, ele falha ao expressar a intenção corretamente:Em outras palavras, use construções conforme pretendidas e documentadas para serem usadas e você se poupará de um mundo de mágoas em C.
fonte
Eu acredito que é uma diferença entre
bool
eBOOL
, confira esta página para uma explicação do porquê:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Como
BOOL
é um tipo emunsigned char
vez de primitivo, as variáveis do tipoBOOL
podem conter valores diferentes deYES
eNO
.Considere este código:
A saída é:
Para a maioria das pessoas, essa é uma preocupação desnecessária, mas se você realmente deseja um booleano, é melhor usar a
bool
. Devo acrescentar: o iOS SDK geralmente usaBOOL
em suas definições de interface, portanto esse é um argumento a ser seguidoBOOL
.fonte
bool
e, portanto, tem sido uma tradição usar umint
ouchar
como um booleano, às vezes com um #define para esconder a diferença e às vezes não. De fato, não tenho certeza se mesmo os padrões atuais precisambool
ser implementados de uma maneira que impeça o exame de sua estrutura interna.printf
conte mentiras. O valor deb
não éYES
, é "não zero", que é o que a condição testa. Então você deve terprintf("b is not zero")
, que não é necessariamente o mesmo queYES
. Nesse caso,b
é "não zero" e "não SIM".Eu fiz um teste exaustivo sobre isso. Meus resultados devem falar por si:
A saída é:
fonte
if
ou em umwhile
. Como ...while("guitar gently weeps")
não deveria funcionar ... #if (user_id = ROOT_UID)
Você pode querer ler as respostas para esta pergunta . Em resumo, em Objective-C (da definição em objc.h):
fonte
A principal diferença (perigosa!) Entre
true
eYES
está na serialização JSON.Por exemplo, temos uma solicitação de servidor do tipo JSON e precisamos enviar true / false no json sence:
Em seguida, convertemos para a string JSON antes de enviar como
O resultado é
Devido à lógica da API,
jsonString1
pode resultar em um erro.Portanto, tenha cuidado com os booleanos no Objective-C.
Para resumir, apenas o
@YES
valor exato e convertido como@((BOOL)expression)
são do__NSCFBoolean
tipo e convertido paratrue
com serialização JSON. Quaisquer outras expressões como@(expression1 && expression2)
(par@(YES && YES)
) são do__NSCFNumber (int)
tipo e convertidas1
em JSON.PS Você pode simplesmente usar booleano com valor de string
fonte
Há um bug sutil que ninguém mencionou aqui, que eu pensei que incluiria ... mais um erro lógico do que qualquer coisa:
portanto, a questão aqui é apenas isso
(YES==1)
e em C a comparação não é booleana, mas baseada em valor.porque
YES
é apenas um#define
(em vez de algo intrínseco à linguagem), tem que ter algum valor e1
faz mais sentido.fonte
Eu acho que eles adicionam SIM / NÃO para ser mais auto-explicativo em muitos casos. Por exemplo:
soa melhor que
fonte
Primeiro, vamos examinar o que é verdadeiro e falso e o que lhes dá significado em primeiro lugar.
podemos construir uma estrutura chamada if a então b else c no cálculo lambda da seguinte maneira:
Em JavaScript, fica assim:
para que IfThenElse seja útil, precisamos de uma função "true" que escolha direita ou esquerda, e faça isso enquanto ignora a outra opção, ou de uma função "false" que escolha a opção "true".
Podemos definir essas funções da seguinte maneira:
em JavaScript, fica assim:
agora podemos fazer o seguinte
sendo doThis e doThat (\ a. ()) porque o cálculo lambda não oferece nenhum serviço, como printing / math / strings, tudo o que podemos fazer é não fazer nada e dizer que fizemos (e depois trapacear substituindo-o por serviços em nosso sistema que fornece efeitos colaterais que queremos)
então vamos ver isso em ação.
Esse é um ambiente profundo que poderia ser simplificado se tivéssemos permissão para usar matrizes / mapas / argumentos / ou mais de uma instrução para dividir em várias funções, mas eu quero manter o mais puro possível, me limitando às funções de exatamente um argumento só.
observe que o nome Verdadeiro / Falso não tem significado inerente, podemos renomeá-los facilmente para sim / não, esquerda / direita, direita / esquerda, zero / um, maçã / laranja. Tem significado que, qualquer que seja a escolha feita, é causada apenas pelo tipo de escolha. Portanto, se "ESQUERDA" for impresso, sabemos que o seletor só pode ser verdadeiro e, com base nesse conhecimento, podemos orientar nossas decisões adicionais.
Então, para resumir
fonte
Não, SIM / NÃO é uma maneira diferente de se referir a VERDADEIRO / FALSO (1/0)
fonte