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

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

if (i && (i - 1))
    printf("%d
", 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
", p[i - 1]);
    }
    return 0; 
}

Всего 5 ответов


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

if (i && (i - 1))

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

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

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

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

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

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


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

Эта строка:

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

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

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


Если i != 0 И i - 1 != 0 ТО печатая элемент i - 1 из p . Это необходимо для проверки i != 0 так как в противном случае на первой итерации будет 0 - 1 = -1 качестве индекса, который является недопустимым.


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
", p[i]);
}

Есть идеи?

10000