Должен ли я проверить, если равен 1 или не равен 0? - PullRequest
10 голосов
/ 08 июня 2010

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

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

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

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

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

Ответы [ 17 ]

47 голосов
/ 08 июня 2010

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

35 голосов
/ 08 июня 2010

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

if (value == false)

или

if (value == true)

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

if (!value)

или

if (value)

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

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

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

10 голосов
/ 08 июня 2010

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

9 голосов
/ 08 июня 2010

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

7 голосов
/ 08 июня 2010

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

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

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

6 голосов
/ 08 июня 2010

Два очка:

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

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

3 голосов
/ 08 июня 2010

Если честно, если значение int равно 1 или 0, вы можете даже сказать:

if (int)

и это было бы то же самое, что сказать

if (int != 0)

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

if (int == 1)

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

2 голосов
/ 09 июня 2010

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

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

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

2 голосов
/ 08 июня 2010

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

if(int == 1)

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

2 голосов
/ 08 июня 2010

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

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

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

...