Простой вопрос на самом деле; есть ли разница между этими значениями (и есть ли разница между BOOL и bool)? Сотрудник упомянул, что они оценивают разные вещи в Objective-C, но когда я посмотрел на typedef в их соответствующих файлах .h, все YES / TRUE / true были определены как, 1
а NO / FALSE / false - как 0
. Есть ли разница?
objective-c
boolean
Кевлар
источник
источник
Ответы:
Практической разницы нет, если вы используете
BOOL
переменные в качестве логических значений. C обрабатывает логические выражения на основе того, имеют ли они 0 или нет 0. Итак:означает так же, как
вот почему вы можете оценивать любой примитивный тип или выражение как логический тест (включая, например, указатели). Обратите внимание, что вы должны сделать первое, а не второе.
Обратите внимание , что есть разница , если вы назначаете тупые значения так называемым
BOOL
переменным и тест для конкретных значений, поэтому всегда использовать их как булевы и только назначить их из своих#define
значений.Важно отметить, что никогда не проверяйте логические значения с использованием сравнения символов - это не только рискованно, поскольку
someVar
может быть назначено ненулевое значение, которое не является ДА, но, на мой взгляд, более важно, оно не может правильно выразить намерение:Другими словами, используйте конструкции так, как они предназначены и задокументированы для использования, и вы избавите себя от мира боли в C.
источник
Я считаю, что есть разница между
bool
иBOOL
, проверьте эту веб-страницу для объяснения причин:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Поскольку тип
BOOL
являетсяunsigned char
скорее, чем примитивным типом, переменные типаBOOL
могут содержать значения, отличные отYES
иNO
.Рассмотрим этот код:
Выход:
Для большинства людей это ненужная проблема, но если вы действительно хотите логическое значение, лучше использовать
bool
. Я должен добавить: iOS SDK обычно используетBOOL
в своих определениях интерфейса, так что это аргумент, который нужно придерживатьсяBOOL
.источник
bool
, и, следовательно, это была традиция использоватьint
илиchar
в качестве логического значения, иногда с #define, чтобы скрыть разницу, а иногда нет. На самом деле, я не уверен, что даже действующие стандарты требуютbool
реализации таким образом, чтобы не допустить проверки его внутренней структуры.printf
лжет. Значениеb
неYES
, это "не ноль", что является условием проверки. Таким образом, вы должны иметьprintf("b is not zero")
, что не обязательно совпадает сYES
. В этом случае,b
оба «не ноль» и «не ДА».Я сделал исчерпывающий тест на это. Мои результаты должны говорить сами за себя:
Выход:
источник
if
илиwhile
. Как ...while("guitar gently weeps")
не должно работать ...if (user_id = ROOT_UID)
Вы можете прочитать ответы на этот вопрос . Таким образом, в Objective-C (из определения в objc.h):
источник
Основное (опасное!) Различие между
true
иYES
заключается в сериализации JSON.Например, у нас есть запрос к серверу JSON-типа, и нам нужно отправить true / false в смысле json:
Затем мы конвертируем его в строку JSON перед отправкой как
Результат
Из-за логики API
jsonString1
может возникнуть ошибка.Так что будьте осторожны с логическими значениями в Objective-C.
В итоге, только точное
@YES
и приведенное значение@((BOOL)expression)
имеют__NSCFBoolean
тип и преобразованы вtrue
сериализацию JSON. Любые другие выражения типа@(expression1 && expression2)
(даже@(YES && YES)
) имеют__NSCFNumber (int)
тип и преобразуются1
в JSON.PS Вы можете просто использовать строковое логическое значение
источник
Есть небольшая ошибка, о которой никто не упомянул, и я подумал, что я бы добавил ... больше логической ошибки, чем что-либо еще:
поэтому проблема здесь только в том, что
(YES==1)
в С сравнение не логическое, а основанное на значении.потому что
YES
это просто#define
(а не что-то присущее языку), оно должно иметь определенную ценность и1
имеет смысл.источник
Я думаю, что они добавляют ДА / НЕТ, чтобы быть более понятным во многих случаях. Например:
звучит лучше чем
источник
Сначала давайте рассмотрим, что такое истина и ложь и что дает им смысл в первую очередь.
мы можем построить структуру, называемую, если a затем b, иначе c в лямбда-исчислении, следующим образом:
В JavaScript это выглядит так:
для того, чтобы ifThenElse был полезен, нам нужна функция «истина», которая выбирает правую или левую и делает это, игнорируя другую опцию, или функция «ложь», которая выбирает опцию «истина», не принимает.
Мы можем определить эти функции следующим образом:
в JavaScript это выглядит так:
Теперь мы можем сделать следующее
с doThis и doThat is (\ a. ()), потому что лямбда-исчисление не предлагает никаких услуг, таких как печать / математика / строки, все, что мы можем сделать, это ничего не делать и говорить, что мы это сделали (а затем обмануть, заменив его службами в наша система, которая обеспечивает побочные эффекты, которые мы хотим)
так что давайте посмотрим на это в действии.
Это глубокая среда, которую можно было бы упростить, если бы нам было разрешено использовать массивы / карты / аргументы / или более одного оператора для разделения на несколько функций, но я хочу сохранить настолько же чисто, насколько я могу ограничиться функциями только одного аргумента только.
Заметьте, что имя True / False не имеет присущего значения, мы можем легко переименовать их в yes / no, влево / вправо, right / left, zero / one, apple / orange. Это имеет значение в том, что какой бы выбор не был сделан, он вызван только тем, кто его сделал. Поэтому, если напечатано «LEFT», мы знаем, что выбор может быть только правдой, и на основе этого знания мы можем руководствоваться нашими дальнейшими решениями.
Итак, подведем итог
источник
Нет, ДА / НЕТ - это другой способ обратиться к ИСТИНА / ЛОЖЬ (1/0)
источник