Что означает тест «if (i && (i-1))»? - PullRequest
2 голосов
/ 08 февраля 2020

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

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 ]

4 голосов
/ 08 февраля 2020

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

if (i && (i - 1))

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

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

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

Это дает значение true, когда i не равно 0 и не равно 1.

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

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

2 голосов
/ 08 февраля 2020

Как правило, в 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

2 голосов
/ 08 февраля 2020

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

1 голос
/ 08 февраля 2020

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

0 голосов
/ 08 февраля 2020

Условное выражение (i && (i - 1) не что иное, как i!=0 && i != 1

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

L oop кипит вплоть до этого,

for (i = 1; i < 6; i++) {
        printf("%d\n", p[i]);
}
...