Пояснение
Я полагаю, вы имели в виду if(!a)
против if(a == 0)
, поскольку if(a)
на самом деле спрашивает, является ли a
ненулевым! Если это так, то ответ следует.
Пояснение
Нет, эти два сгенерируют эквивалентный вывод с большинством компиляторов. Это должно выполняться почти для любого языка с подобным синтаксисом для этого случая, а не только для C.
Также обратите внимание, что современные компиляторы очень хороши в оптимизации, и, таким образом, более сложные примеры эквивалентного поведения и другого синтаксиса также вероятныдля компиляции с тем же результатом.
Оптимизация вряд ли сыграет здесь какую-то роль, так как фрагменты настолько просты, что синтаксически эквивалентны, и оба явно просто компилируются в инструкцию jne
, перепрыгивая черезкод в блоке if.
Убедитесь сами!
Используя godbolt.org Проводник компилятора, вы можете на самом деле проверить, если, скажем, GCC или Clang выводиттакая же сборка для этих фрагментов.
https://godbolt.org/z/XvTKej имеет две вкладки исходного кода и две вкладки компилятора. Как видите, две исходные вкладки содержат два рассматриваемых фрагмента, if(!a)
и if(a==0)
, а две вкладки компилятора (обе имеют одинаковую версию GCC) перечисляют созданную сборку - первая вкладка исходного кода для первой вкладки компилятораи второй за вторым. Сборка, созданная для обеих версий, одинакова!
Вы можете переключить компиляторы, чтобы проверить, выполняется ли то же самое для разных версий GCC или для Clang, или для любого количества маленьких и / или неясных компиляторов.
Что вы должны использовать?
В настоящее время согласовано стиль, что для большинства случаев вы должны использовать if(!a)
, а не if(a == 0)
. Это наиболее очевидно в случае, когда 0 - исключительное значение для a
, означающее, что что-то не , например, это:
// Check status data
if(!status) { // Status check failed
// handle failure case
} else if(status == 1) { // Status OK
// handle OK case
} // ...and so on for other cases
Хотя вы можете использоватьswitch
для такого рода вещей, я надеюсь, что смысл, который я подчеркиваю, понятен.
Этот тип синтаксиса может быть менее идеальным, если, например, 0 означает, что что-то равно так - тогда использование !a
, которое читается как "не a
", может быть более запутанным, чем просто использование a == 0
. Так что не следуйте слепо правилу в этом отношении, но большую часть времени if(!a)
является хорошим выбором.