Я не понимаю эту строку кода:
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]);
}