Naprawdę proste pytanie; czy istnieje różnica między tymi wartościami (i czy istnieje różnica między BOOL a bool)? Współpracownik wspomniał, że oceniają różne rzeczy w Objective-C, ale kiedy spojrzałem na kroje czcionek w ich odpowiednich plikach .h, YES / TRUE / true zostały zdefiniowane jako, 1
a NO / FALSE / false zostały zdefiniowane jako 0
. Czy naprawdę jest jakaś różnica?
objective-c
boolean
Kevlar
źródło
źródło
Odpowiedzi:
Nie ma praktycznej różnicy pod warunkiem, że używasz
BOOL
zmiennych jako wartości logicznych. C przetwarza wyrażenia boolowskie w oparciu o to, czy dają 0 czy nie 0. Więc:oznacza to samo co
dlatego każdy typ lub wyrażenie prymitywne można oceniać jako test logiczny (w tym np. wskaźniki). Pamiętaj, że powinieneś zrobić to pierwsze, a nie drugie.
Zauważ, że nie ma różnicy, jeśli przypisać wartości rozwarte do tzw
BOOL
zmiennej i test dla określonych wartości, więc zawsze używać ich jako wartości logiczne i przypisać tylko ich z#define
wartościami.Co ważne, nigdy nie testuj wartości logicznych za pomocą porównania znaków - jest to nie tylko ryzykowne, ponieważ
someVar
można by przypisać wartość niezerową, która nie jest TAK, ale, moim zdaniem, co ważniejsze, nie pozwala poprawnie wyrazić intencji:Innymi słowy, używaj konstruktów zgodnie z ich przeznaczeniem i dokumentacją do użycia, a oszczędzisz sobie świata krzywdy w C.
źródło
Wierzę, że jest różnica między
bool
iBOOL
, sprawdź tę stronę o wyjaśnienie dlaczego:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Ponieważ
BOOL
jestunsigned char
typem raczej niż pierwotnym, zmienne typuBOOL
mogą zawierać wartości inne niżYES
iNO
.Rozważ ten kod:
Wynik to:
Dla większości ludzi jest to niepotrzebna obawa, ale jeśli naprawdę chcesz mieć wartość logiczną, lepiej jest użyć
bool
. Powinienem dodać: SDK iOS zwykle używaBOOL
definicji interfejsu, więc jest to argument, którego należy się trzymaćBOOL
.źródło
bool
, i dlatego tradycją jest używanieint
lubchar
jako wartości logicznej, czasami z #define, aby ukryć różnicę, a czasami nie. Właściwie nie jestem pewien, czy nawet obecne standardy wymagająbool
implementacji w sposób uniemożliwiający badanie jego wewnętrznej struktury.printf
kłamie. Wartośćb
nieYES
jest równa „nie zero”, co sprawdza warunek. Więc powinieneś to zrobićprintf("b is not zero")
, co niekoniecznie jest tym samym, coYES
. W tym przypadkub
jest zarówno „niezerowe”, jak i „nie TAK”.Zrobiłem wyczerpujący test na tym. Moje wyniki powinny mówić same za siebie:
Wynik to:
źródło
if
lubwhile
. Jak ...while("guitar gently weeps")
nie powinno działać ...if (user_id = ROOT_UID)
Możesz przeczytać odpowiedzi na to pytanie . Podsumowując, w Objective-C (z definicji w objc.h):
źródło
Główna (niebezpieczna!) Różnica między
true
iYES
dotyczy serializacji JSON.Na przykład mamy żądanie serwera typu JSON i musimy wysłać true / false w json sence:
Następnie konwertujemy go na ciąg JSON przed wysłaniem jako
Wynik to
Ze względu na logikę interfejsu API
jsonString1
może spowodować błąd.Dlatego uważaj na wartości logiczne w Objective-C.
Podsumowując, tylko dokładne
@YES
i rzutowane wartości@((BOOL)expression)
są__NSCFBoolean
typu i konwertowane natrue
z serializacją JSON. Wszystkie inne wyrażenia, takie jak@(expression1 && expression2)
(parzyste@(YES && YES)
), są__NSCFNumber (int)
typu i są konwertowane na1
format JSON.PS Możesz po prostu użyć wartości logicznej typu string
źródło
Istnieje subtelny błąd, o którym nikt tutaj nie wspomniał, a myślałem, że powinienem zawrzeć ... bardziej logiczny błąd niż cokolwiek innego:
więc problem polega na tym, że
(YES==1)
w C porównanie nie jest logiczne, ale oparte na wartości.ponieważ
YES
jest tylko#define
(a nie czymś nieodłącznym dla języka), musi mieć jakąś wartość i1
ma jak największy sens.źródło
Myślę, że dodają TAK / NIE, aby w wielu przypadkach były bardziej oczywiste. Na przykład:
brzmi lepiej niż
źródło
Najpierw zbadajmy, co jest prawdą, a co fałszem i co nadaje im znaczenie.
możemy skonstruować strukturę o nazwie if a then b else c w rachunku lambda w następujący sposób:
W JavaScript wygląda to tak:
aby ifThenElse było użyteczne, potrzebujemy funkcji „true”, która wybiera prawo lub lewo i robi to, ignorując drugą opcję, lub funkcja „false”, która wybiera opcję „true”, nie przyjmuje.
Możemy zdefiniować te funkcje w następujący sposób:
w JavaScript wygląda to tak:
teraz możemy wykonać następujące czynności
z doThis i doThat jest (\ a. ()) ponieważ rachunek lambda nie oferuje żadnych usług, takich jak drukowanie / matematyka / ciągi znaków, wszystko, co możemy zrobić, to nic nie robić i powiedzieć, że to zrobiliśmy (a później oszukiwać, zastępując to usługami w nasz system, który zapewnia pożądane efekty uboczne)
zobaczmy to w akcji.
To głębokie środowisko, które można by uprościć, gdyby pozwolono nam używać tablic / map / argumentów / lub więcej niż jednej instrukcji do podziału na wiele funkcji, ale chcę, aby było tak czyste, jak tylko mogę, ograniczając się do funkcji dokładnie jednego argumentu tylko.
zauważ, że nazwa Prawda / Fałsz nie ma żadnego wewnętrznego znaczenia, możemy łatwo zmienić ich nazwę na tak / nie, lewo / prawo, prawo / lewo, zero / jeden, jabłko / pomarańcza. Ma to znaczenie w tym, że dokonany wybór jest spowodowany jedynie rodzajem dokonanego wyboru. Jeśli więc wydrukowano „LEFT”, wiemy, że wybór może być tylko prawdziwy i na podstawie tej wiedzy możemy kierować naszymi dalszymi decyzjami.
Podsumowując
źródło
Nie, TAK / NIE to inny sposób określania PRAWDA / FAŁSZ (1/0)
źródło