我不明白这行代码:
if (i && (i - 1)) printf("%dn", 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("%dn", 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 时,此值计算为 true。
因此,从索引 i 等于 2 开始,条件的计算结果为 true。
因此,循环输出数组的所有元素,除了第一个元素和最后一个元素。
通常,在 C 中,不为 0 的值将被评估为true
,而零将被评估为false
。
这一行:
if (i && (i - 1))
printf("%dn", 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
则打印p
的i - 1
元素。这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("%dn", p[i]);
}