Como mencionado acima, BOOLpode ser um unsigned chartipo, dependendo da sua arquitetura, enquanto boolé do tipo int. Uma experiência simples mostrará a diferença por que BOOL e bool podem se comportar de maneira diferente:
bool ansicBool = 64;
if(ansicBool != true) printf("This will not print\n");
printf("Any given vlaue other than 0 to ansicBool is evaluated to %i\n", ansicBool);
BOOL objcBOOL = 64;
if(objcBOOL != YES) printf("This might print depnding on your architecture\n");
printf("BOOL will keep whatever value you assign it: %i\n", objcBOOL);
if(!objcBOOL) printf("This will not print\n");
printf("! operator will zero objcBOOL %i\n", !objcBOOL);
if(!!objcBOOL) printf("!! will evaluate objcBOOL value to %i\n", !!objcBOOL);
Para sua surpresa if(objcBOOL != YES), o 1 será avaliado pelo compilador, uma vez que, YESna verdade , é o código de caractere 1 e, aos olhos do compilador, o código de caractere 64 não é, obviamente, igual ao código de caractere 1, portanto, a instrução if será avaliada comoYES/true/1 e a linha a seguir será corre. No entanto, como um booltipo nenhum zero avalia sempre o valor inteiro 1, o problema acima não afetará seu código. Abaixo estão algumas boas dicas se você deseja usar o Objective-C BOOLtipo versus o ANSI C booltipo:
- Sempre atribua o valor
YESou NOnada mais.
- Converter
BOOL tipos usando o !!operador double not para evitar resultados inesperados.
- Ao verificar o
YESuso if(!myBool) instead of if(myBool != YES), é muito mais limpo usar o !operador not e fornece o resultado esperado.