Ответ 1
Человеческие мозги улучшают операторы процесса, которые не содержат отрицаний, что делает "int == 1" лучшим способом.
На днях я кодировался, написав пару операторов if с целыми числами, которые всегда либо 0
, либо 1
(практически действующие как bool
s). Я спросил себя:
При тестировании на положительный результат, что лучше; тестирование для int == 1
или int != 0
?
Например, если задано int n
, если я хочу проверить, если он true
, следует ли использовать n == 1
или n != 0
?
Есть ли какая-либо разница в отношении скорости, мощности обработки и т.д.
Пожалуйста, игнорируйте тот факт, что int может быть больше/меньше 1
/0
, это не имеет значения и не происходит.
Человеческие мозги улучшают операторы процесса, которые не содержат отрицаний, что делает "int == 1" лучшим способом.
Это действительно зависит. Если вы используете язык, поддерживающий booleans, вы должны использовать логическое, а не целое число, то есть:
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)
, поскольку отрицание более сложное и, скорее всего, приведет к ошибкам обслуживания.
Если вы работаете со значениями, которые могут быть только 1 или 0, то я предлагаю вам использовать логические значения для начала, а затем просто сделать if (bool)
или if (!bool)
.
В языке, где int, который не является 0, представляет собой логическое значение "true", а 0 "false", например C, я буду использовать if (int != 0)
, потому что он представляет то же значение, что и if (int)
, тогда как int == 1
представляет собой целое значение, равное 1, а не логическое значение true. Это может быть только я. В языках, поддерживающих логический тип, всегда используйте его, а не int.
А глупо вопрос. Если вы тестируете на 1, проверьте на 1, если вы тестируете нулевое значение, выполните проверку на нуль.
Добавление оператора else
может сделать выбор произвольным. Я бы выбрал, что имеет наибольший смысл или имеет более контекстуальное значение, стандартное или "естественное" поведение, предлагаемое ожидаемой частотой появления, например.
Этот выбор между int == 0
и int != 1
вполне может сводиться к субъективным оценкам, о которых, вероятно, не стоит беспокоиться.
Две точки:
1) Как отмечалось выше, более явным является выигрыш. Если вы добавите что-то в пустой список, вы не только хотите, чтобы его размер был не нулевым, но вы также хотите, чтобы он был явно 1.
2) Вы можете захотеть сделать (1 == int) Таким образом, если вы забудете = вы получите ошибку компиляции, а не сеанс отладки.
Если честно, если значение int равно 1 или 0, вы можете даже сказать:
if (int)
и это будет то же самое, что сказать
if (int != 0)
но вы, вероятно, захотите использовать
if (int == 1)
потому что не ноль потенциально мог бы дать ответу что-то отличное от 1, даже если вы сказали, что не беспокоитесь об этом.
Если возможны только два значения, я бы использовал первый:
if(int == 1)
потому что он более явный. Если бы не было ограничений на значения, я бы подумал иначе.
IF INT IS 1
NEXT SENTENCE
ELSE MOVE "INT IS NOT ONE" TO MESSAGE.
Как говорили другие, использование ==
часто легче читать, чем при использовании !=
.
Тем не менее, большинство процессоров имеют конкретную операцию сравнения с нулем. Это зависит от конкретного компилятора, процессора и т.д., Но при использовании != 0
over == 1
может быть почти неимоверное преимущество в скорости.
Большинство языков позволят вам использовать if (int)
и if (!int)
, хотя это и более удобочитаемо, и дает вам этот незначительный бонус скорости.
Я параноик. Если значение равно либо 0
или 1
, то оно может быть 2
. Может быть, не сегодня, может быть, не завтра, но некоторые программисты-программисты собираются сделать что-то странное в подклассе. Иногда я совершаю ошибки сам (не рассказываю своему работодателю). Итак, сделайте код, скажите, скажите мне, что значение равно либо 0
или 1
, иначе оно плачет в мумию.
if (i == 0) {
... 0 stuff ...
} else if (i == 1) {
... 1 stuff ...
} else {
throw new Error();
}
(Возможно, вы предпочитаете switch
- я нахожу, что его синтаксис в фигурных скобках слишком тяжелый.)
При использовании целых чисел в качестве булевых элементов я предпочитаю их интерпретировать следующим образом: false = 0, true = non-zero.
Я хотел бы написать оператор условия как int == 0 и int!= 0.
Я бы сказал, что это зависит от семантики, если вы условие означает
while ( ! abort )
отрицание в порядке.
if ( quit ) break;
также будет нормально.
if( is_numeric( $int ) ) { its a number }
elseif( !$int ) { $int is not set or false }
else { its set but its not a number }
конец обсуждения: P
Я согласен с тем, что большинство людей сказали в этом посте. Гораздо эффективнее использовать логические значения, если у вас есть одна из двух различных возможностей. Это также упрощает чтение и интерпретацию кода.
if (bool) {...}
Я был из мира c. Сначала я мало что понимаю о objective-c. Через некоторое время я предпочитаю что-то вроде:
if (int == YES)
или
if (int == NO)
в c, то есть:
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
(Предполагая, что ваши int могут быть только 1 или 0). Оба утверждения логически эквивалентны. Я бы рекомендовал использовать синтаксис ==, хотя, поскольку я думаю, что это яснее для большинства людей, когда вы не вводите ненужных отрицаний.