В C целые числа могут использоваться в логическом контексте, и ноль представляет ложь, а ненулевое значение — истину.
Вот почему ваш код работает. Выражение num % 2
будет равно 0 (единственное ложное значение) для четного числа и 1 (одно из многих возможных истинных значений) для нечетного числа.
Все следующие выражения будут работать для обнаружения нечетного числа:
num % 2
(num % 2) != 0
((num % 2) != 0) != 0
... and so on, ad untilyougetboredum (like 'ad infinitum' but with limits).
Сказав это, я действительно не считаю хорошей идеей делать это таким образом, код должен выражать намерение в максимально возможной степени, и намерение здесь должно состоять в том, чтобы выбрать путь выполнения на основе сравнения. Это означает, что если вы ищете нечетное число, вы должны использовать что-то вроде (num % 2) == 1
.
Вам также не нужен отдельный вызов printf
в каждом из этих путей кода:
printf("%d is %s\n", num, ((num % 2) == 1) ? "odd" : "even");
Вы заметите, что я также использовал num
вместо i
. Это просто мой стиль, связанный с вышеупомянутым намерением. Если переменная используется только как индекс, я с удовольствием использую переменные типа i
(a), но во-вторых, она получает семантическое свойство (например, число проверяется на странность), Я склонен использовать более описательные имена.
У меня нет проблем с людьми, использующими простые имена переменных, я просто предпочитаю более описательные имена в своем собственном коде.
(a) На самом деле, я бы, наверное, использовал idx
в этом случае, но это слишком CDO(b), даже для меня :-)
(b) ОКР, но в правильном порядке :-)
person
paxdiablo
schedule
06.12.2019
i%2
— это выражение скалярного значения. это неявно важно для истинного (ненулевого) или ложного (ноль) в контексте выражения, подобном вашему. - person WhozCraig   schedule 06.12.2019printf ("%d is %s\n", i, i % 2 ? "odd" : "even")
тоже работает:)
- person David C. Rankin   schedule 06.12.2019static const char *msg[] = {"even","odd"};
и в своем цикле вы делаете что-то вродеprintf("%d is %s\n", i, msg[i%2]);
, но теперь мы уходим от устава вашего вопроса. - person WhozCraig   schedule 06.12.2019