2

我不明白这行代码:

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; 
}
4

5 回答 5

4

此 if 语句的条件

if (i && (i - 1))

为了清楚起见,可以重写,例如

if (i != 0 && (i - 1) != 0)

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

当 i 不等于 0 且不等于 1 时,这评估为真。

因此,从索引 i 等于 2 开始,条件评估为真。

所以循环输出数组的所有元素,除了第一个元素和最后一个元素。

于 2020-02-08T14:17:53.683 回答
2

If i != 0AND i - 1 != 0THEN 打印 的i - 1元素p。此i != 0检查需要,否则在第一次迭代时它将0 - 1 = -1作为无效的索引。

于 2020-02-08T14:15:38.853 回答
2

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

这一行:

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

基本上检查iand的值i-1是否不同于0. 这意味着不会打印数组中的前 2 个元素,因为i=0我们会得到i哪个是falsei=1我们会得到(i-1)哪个是false

所以这段代码的结果应该是打印4, -7, 2, 8, 0

于 2020-02-08T14:19:28.430 回答
1

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

于 2020-02-08T14:17:39.163 回答
-1

条件语句(i && (i - 1)不过是i!=0 && i != 1

简而言之,在迭代中跳过 0 和 1 并打印从 1 到 5 的元素

循环归结为这一点,

for (i = 1; i < 6; i++) {
        printf("%d\n", p[i]);
}
于 2020-02-08T15:31:17.780 回答