我不明白这行代码:
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;
}
我不明白这行代码:
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;
}
此 if 语句的条件
if (i && (i - 1))
为了清楚起见,可以重写,例如
if (i != 0 && (i - 1) != 0)
在条件中检查索引 i 的当前值是否等于 0。如果不等于 0,则索引 i - 1 的先前值是否等于 0。
当 i 不等于 0 且不等于 1 时,这评估为真。
因此,从索引 i 等于 2 开始,条件评估为真。
所以循环输出数组的所有元素,除了第一个元素和最后一个元素。
If i != 0
AND i - 1 != 0
THEN 打印 的i - 1
元素p
。此i != 0
检查需要,否则在第一次迭代时它将0 - 1 = -1
作为无效的索引。
通常,在 C 中,非 0 的值将被评估为,true
而零将被评估为false
。
这一行:
if (i && (i - 1))
printf("%d\n", p[i - 1]);
基本上检查i
and的值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]);
}