Что означает тест "if (i && (i- 1))"?

Я не понимаю эту строку кода:

if (i && (i - 1))
    printf("%d\n", p[i - 1]);
int main(void) {
    int p[7] = {-5, 1, 4, -7, 2, 8, 0};
    int i;

    for (i = 0; i < 7; i++) {
         if (i && (i - 1))
            printf("%d\n", p[i - 1]);
    }
    return 0; 
}

5 ответов

Решение

Условие этого оператора if

if (i && (i - 1))

можно переписать для ясности, например

if (i != 0 && (i - 1) != 0)

В условии проверяется, равно ли текущее значение индекса i нулю, а если оно не равно 0, то равно ли 0 предыдущее значение индекса i - 1.

Это оценивается как истина, если i не равно 0 и не равно 1.

Таким образом, условие оценивается как истинное, начиная с индекса i, равного 2.

Таким образом, цикл выводит все элементы массива, кроме первого и последнего элементов.

Если i != 0 А ТАКЖЕ i - 1 != 0 ТОГДА печать i - 1 элемент p. Этаi != 0 проверьте необходимость, так как иначе на первой итерации было бы 0 - 1 = -1 как недействительный индекс.

Как правило, в C значения, отличные от 0, будут оцениваться как true а ноль будет оцениваться как false.

Эта строка:

if (i && (i - 1))
   printf("%d\n", p[i - 1]);

в основном проверяет, действительно ли значение i а также i-1 отличается от 0. Это означает, что 2 первых элемента в массиве не будут напечатаны, поскольку дляi=0 мы получим i который false и для i=1 мы получим (i-1) который false

Таким образом, результатом этого кода должна быть печать 4, -7, 2, 8, 0

if (i && (i - 1)) в основном if (i != 0 && i != 1).

Заявление о состоянии (i && (i - 1) не что иное, как i!=0 && i != 1

Короче говоря, 0 и 1 пропускаются в итерации, а элементы от 1 до 5 печатаются.

Петля сводится к этому,

for (i = 1; i < 6; i++) {
        printf("%d\n", p[i]);
}
Другие вопросы по тегам