Что означает тест "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
Заявление о состоянии (i && (i - 1)
не что иное, как i!=0 && i != 1
Короче говоря, 0 и 1 пропускаются в итерации, а элементы от 1 до 5 печатаются.
Петля сводится к этому,
for (i = 1; i < 6; i++) {
printf("%d\n", p[i]);
}