测试“if (i && (i- 1))”是什么意思?

What does the test “if (i && (i- 1))” mean?

我不明白这行代码:

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 != 0 AND i - 1 != 0 THEN 打印 pi - 1 元素。此 i != 0 检查需要,否则在第一次迭代时它将 0 - 1 = -1 作为无效的索引。

if (i && (i - 1)) 基本上是 if (i != 0 && i != 1).

这个if语句的条件

if (i && (i - 1))

为了清楚起见,可以像

那样重写
if (i != 0 && (i - 1) != 0)

在条件中检查索引i的当前值是否等于0。如果不等于0则索引i-1的前值是否等于0。

当 i 不等于 0 且不等于 1 时,此计算结果为真。

因此条件从等于 2 的索引 i 开始计算为真。

因此循环输出数组中除第一个元素和最后一个元素之外的所有元素。

通常,在 C 中,非 0 的值将被计算为 true,而零将被计算为 false

这一行:

if (i && (i - 1))
   printf("%d\n", p[i - 1]);

基本上检查ii-1的值是否与0不同。其含义是数组中的前 2 个元素不会被打印,因为对于 i=0 我们将得到 ifalse 而对于 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]);
}