Идиоматический способ проверить ненулевое

Когда я хочу проверить, является ли значение 0 в C, как это делается идиоматически?

  • if (!num)
  • if (num == 0)

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

     if (!isVisible) {...} if (isVisible == 0) {...} // Intention not as clear as line above. if (numberOfItems == 0) {...} if (!numberOfItems) {...} // Intention not as clear as line above. 

    Я всегда предпочитаю второй путь:

     if (num == 0) 

    Как num == 0 или ptr == NULL вычисляет значение boolean, которое является целью. Компилятор Java применяет эту форму, но компиляторы C / C ++ этого не делают.

    Хуже всего это будет:

     if (!strcmp(str, "something")) 

    Что действительно скрывает его намерение, поскольку семейство функций strcmp не возвращает логическое значение, они возвращают положительный, нулевой или отрицательный (как указано @JoachimPileborg).

    Однако, если int используется для представления булевого типа, для которого C не имеет встроенного типа, то эта форма в порядке:

     if (!b) 

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

     typedef int bool; #define true 1 #define false 0 bool b = true; if (!b) { ... etc } 

    Независимо от того, что другие сказали вам С ИСКЛЮЧЕНИЕМ!

    Не делайте этого с float и double . IEEE 754 float s / double s / long double s (наиболее часто используемые) часто не содержат точных значений, поэтому сравнение их непосредственно с 0 глупо (или if (!floatValue) )

    Пример: http://ideone.com/PIUflA

     float f = 0.3; f -= 0.2; f -= 0.1; if (!f) { printf("zero\n"); } else { printf("non zero\n"); } if (f == 0) { printf("zero\n"); } else { printf("non zero\n"); } 

    С неоптимизированной компиляцией можно вернуться (на ideone делает)

     non zero non zero 

    (если вы включите оптимизацию, компилятор может предварительно вычислить некоторые значения в более высокой точности и округлить их до 0 )

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

    Конечно, для компилятора это не имеет значения. Для человека читатель это делает. Поскольку обе формы используются другими людьми, вы должны привыкнуть к ним и признать их. Лично я предпочитаю кратчайшую форму, которая занимает меньше времени (меньше токенов, особенно круглых скобок), чтобы читать и понимать. Особенно:

     if (!ptr) {} if (!strcmp(a,b)) {} 

    легче читать, чем

     if (ptr != NULL) {} if (strcmp(a,b) == 0) {} of (0 == strcmp()) {} 

    Последняя форма делает меня физически больным.

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

    Для ясности я обычно имею, if (num == 0) , так как меньше думать, чтобы понять, что я делаю, когда я перехожу по моему коду.

    !!value тоже будет работать, если вы хотите проверить, отличное ли значение.

    !value 1 при значении = 0 и 0 при значении ≠ 0.
    Второй ! переворачивает его, делая !!value оценивается до 1, когда значение ≠ 0 и 0, когда значение = 0.

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