Чем можно заменить запись
Чему будет равно выражение arr[i] % 2 && arr[i] % 6, если использовать в if и чтобы выполнилось?
arr[i] % 2 == 0 && arr[i] % 6 == 0 или arr[i] % 2 == 1 && arr[i] % 6 == 1
Не до конца понимаю
Ответы (1 шт):
В C нет настоящего булевого типа. Роль булевых значений играют целые ноль и единица. Оператор && возвращает единицу если оба его аргумента не равны нулю, иначе - ноль.
Выражения A && B и A != 0 && B != 0 вычисляют одно и то же значение (иногда нужно добавить скобки).
В нашем случае arr[i] % 2 && arr[i] % 6 равносильно (arr[i] % 2 != 0) && (arr[i] % 6 != 0). Скобки надеты для ясности, обычно их не пишут. Языку не важно как вы записали выражение, легче читать вариант с != 0 - целые значения явно преобразуются в булевы.
Выражение arr[i] % 2 для положительных arr[i] может быть нулём или единицей. Можно написать (arr[i] % 2 == 1) && (arr[i] % 6 != 0). Ещё раз оговорюсь, эта замена верна только если вы уверены что arr[i] >= 0.
Вторую скобку, с шестёркой, никак не переделать, если записывать компактно.
Я бы писал так: arr[i] % 2 != 0 && arr[i] % 6 != 0. Читается как "arr[i] не делится на два и не делится на шесть".