2010-06-07 1 views
10

На днях я кодировал здесь пару писем с целыми числами, которые всегда либо 0, либо 1 (практически действующие как bool). Я спросил себя:Должен ли я проверить, равен ли он 1 или не равен 0?

При тестировании на положительный результат, что лучше; тестирование для int == 1 или int != 0?

Например, дано Int n, если я хочу, чтобы проверить, если это true, я должен использовать n == 1 или n != 0?

Есть ли какая-либо разница в отношении скорости, вычислительной мощности и т. Д.?

Пожалуйста, игнорируйте тот факт, что int может быть больше/меньше 1/0, это не имеет значения и не возникает.

+0

Почему все эти теги, спросите вы? Ну, я считаю это многоязычным вопросом. Вы можете опубликовать ответ, который действителен только на одном из этих языков, и я буду счастлив;) – Emil

+5

@Emil: В этом случае вам может потребоваться вместо этого переустановить его язык-агностик. –

+1

Что такое int? AFAIK это зарезервированное ключевое слово. Если переменная является чем-то вроде bool a = true | false, вы должны использовать if (a == true), например, – segfault

ответ

47

Человеческий мозг - лучшие операторы процесса, которые не содержат отрицаний, что делает «int == 1» лучшим способом.

+79

Или люди могут лучше обрабатывать утверждения, которые являются положительными. –

+15

+1 для Mark Byers;) Я написал это намеренно –

+5

Вы не могли сказать, что люди не предпочитают не использовать не мало отрицаний. Подождите, или было наоборот? :-) – Francesco

35

Это действительно зависит. Если вы используете язык, который поддерживает булевы, вы должны использовать логическое значение, не является целым числом, то есть:

if (value == false) 

или

if (value == true) 

Это, как говорится, с реальными булевыми типами, это вполне допустимо (и, как правило, лучше), чтобы просто написать:

if (!value) 

или

if (value) 

В большинстве современных языков на самом деле очень мало причин, чтобы когда-либо использовать целое число для булевой операции.

Если вы используете язык, который не поддерживает булевы напрямую, лучший вариант здесь действительно зависит от того, как вы определяете истину и ложь. Часто false равно 0, а true - это что-то иное, чем 0. В этой ситуации, используя if (i == 0) (для ложной проверки) и if (i != 0) для проверки подлинности.

Если вам гарантировано, что 0 и 1 являются единственными двумя значениями, я бы, вероятно, использовал if (i == 1), поскольку отрицание является более сложным и, скорее всего, приведет к ошибкам обслуживания.

+0

Objective-C поддерживает логические значения, верно? У меня проблемы с NSLogging booleans, поэтому я использую int. (не имеет значения для вопроса) – Emil

+0

@Emil: Objective-C, как и C, не содержит «реального» булева типа, но имеет макрос, определяющий его (для YES и NO вместо TRUE/FALSE). Подробнее см. Http://iphonedevelopertips.com/objective-c/of-bool-and-yes.html –

+0

Какова бы ни была точка 'if (false)'? он никогда не выполнит свои утверждения. И 'if (true)' всегда будет выполнять свои инструкции. – Joren

2

Если только два значения возможны, то я бы использовать первый:

if(int == 1) 

, потому что это более четко. Если бы не было ограничений на значения, я бы подумал иначе.

0

(Предполагая, что ваши int могут быть только 1 или 0). Оба утверждения логически эквивалентны. Я бы рекомендовал использовать синтаксис ==, хотя, по-моему, это яснее для большинства людей, когда вы не вводите ненужных отрицаний.

1

При использовании целых чисел в качестве булевых элементов я предпочитаю их интерпретировать следующим образом: false = 0, true = non-zero.

Я хотел бы написать заявления состояние как Int == 0 и ИНТ! = 0.

7

Настоящий вопрос действительно. Если вы тестируете 1, проверьте на 1, если вы тестируете нуль, проверьте на ноль.

Добавление заявления else может сделать выбор показательным. Я бы выбрал, что имеет наибольший смысл или имеет более контекстуальное значение, стандартное или «естественное» поведение, предлагаемое ожидаемой частотой появления, например.

Этот выбор между int == 0 и int != 1 может очень хорошо сводиться к субъективным оценкам, о которых, вероятно, не стоит беспокоиться.

+2

Не идет к -1, потому что первые два пункта вполне допустимы, но называть его глупым вопросом немного. Кроме того, четкость кода/читаемость может быть очень субъективной, но я бы не назвал ее «не стоит беспокоиться». – Tanzelax

+0

Последний абзац следует читать как подпункт второго абзаца, что иногда любые преимущества для удобочитаемости могут стать настолько незначительными, что становится пустой тратой времени, беспокоясь о том, следует ли вам проверять на '(int == 1) или' (int! = 0) ', на ум приходит фраза« дьявол в деталях ». –

10

Если вы работаете со значениями, которые могут быть только 1 или 0, то я предлагаю вам использовать логические значения для начала, а затем просто делать if (bool) или if (!bool).

9

В языке, где INT, которые не являются 0 представляет логическое значение «TRUE» и 0 «ложь», как C, я, как правило, использовать if (int != 0), потому что он представляет собой то же значение, как if (int), тогда как int == 1 представляет собой целое значение равным 1, а не логическому истинному. Это может быть только я. В языках, поддерживающих логический тип, всегда используйте его, а не int.

3

Чтобы быть честным, если значение междунар только 1 или 0 можно даже сказать:

if (int) 

и это было бы то же самое, как говорят

if (int != 0) 

, но вы, вероятно, хотели бы используйте

if (int == 1) 

потому что не нуль потенциально может дать ответ быть чем-то иным, чем 1, хотя вы сказали не беспокоиться об этом.

1

Я бы сказал, это зависит от семантики, если условие означает

while (! abort) отрицания нормально.

if (quit) break; будет также в порядке.

2
IF INT IS 1 
NEXT SENTENCE 
ELSE MOVE "INT IS NOT ONE" TO MESSAGE. 
+0

Какой langauge это? – Emil

+3

http://lolco.de: P – Tobias

+0

Язык Агностик;) – Microkernel

6

Две точки:

1) Как уже отмечалось выше, является более явным является победа. Если вы что-то добавить в пустой список, вы не только хотите его размер, чтобы быть не равна нулю, но вы также хотите, чтобы это было явно 1.

2) Вы можете сделать (1 == INT) Таким образом, если вы забудете = вы получите ошибку компиляции, а не сеанс отладки.

+1

Никто не сказал об этом, поэтому я дам свой голос здесь. +1 do (const/final == var) Таким образом, если вы забудете a =, вы получите ошибку компиляции, а не сеанс отладки. –

1
if(is_numeric($int)) { its a number } 
elseif(!$int) { $int is not set or false } 
else { its set but its not a number } 

конец дискуссии: P

+0

Да, как его еще больше усложняет? Ха-ха. :) – Emil

+0

эй, не обвиняй мессенджера: P – Tobias

1

Я согласен с тем, что большинство людей говорит на этом посту. Гораздо эффективнее использовать логические значения, если у вас есть одна из двух различных возможностей.Это также упрощает чтение и интерпретацию кода.

если (BOOL) {...}

1

я из гр мире. Сначала я не очень разбираюсь в объективных-с. Через некоторое время, я предпочитаю что-то вроде:

if (int == YES) 

или

if (int == NO) 

в с, то есть:

if (int == true) 
if (int == false) 

в эти дни, я использую varchar вместо integer в качестве ключей таблицы тоже например

name marital_status 
------ -------------- 
john  single 
joe  married 

намного лучше, чем:

name marital_status 
------ -------------- 
john   S 
joe   M 

или

name marital_status 
------ -------------- 
john   1 
joe   2 
+1

Но тогда вы столкнулись с проблемой, что ints обрабатываются гораздо лучше в базах данных, чем в varchars. Лучше использовать «tinyint (1)» с различными значениями. –

+0

"В наши дни я использую varchar вместо integer как клавиши таблицы" Некоторые будут называть это храбростью – TBH

2

Как уже говорили другие, используя == часто легче читать, чем при использовании !=.

При этом большинство процессоров имеют конкретную операцию сравнения с нулем. Это зависит от конкретного компилятора, процессора и т. Д., Но при использовании != 0 может быть почти неизмеримо малое преимущество в скорости по сравнению с == 1.

Большинство языков позволит вам использовать if (int) и if (!int), хотя это и более удобочитаемо, и дает вам этот незначительный бонус скорости.

2

Я параноик. Если значение равно 0 или 1, то это может быть 2. Может быть, не сегодня, может быть, не завтра, но некоторые программисты-программисты собираются сделать что-то странное в подклассе. Иногда я сам делаю ошибки [shh, не говорите моему работодателю]. Итак, сделайте код, скажите, скажите мне, что значение равно 0 или 1, иначе оно плачет мумии.

if (i == 0) { 
    ... 0 stuff ... 
} else if (i == 1) { 
    ... 1 stuff ... 
} else { 
    throw new Error(); 
} 

(Вы можете предпочесть switch - Я нахожу его синтаксис в фигурном языке брекета слишком тяжел.)

+0

* Прочитайте вопрос! * «Пожалуйста, не отвечайте на вещи, касающиеся int может быть больше/меньше, чем 1/0, это не то, что я хочу знать ». – Emil

+2

@Emil Это то, что вам нужно знать. –

+0

+1 для обозначения того, что int не ограничены 0 или 1 – mikek3332002

Смежные вопросы