【问题标题】:What does the test “if (i && (i- 1))” mean?测试“if (i && (i- 1))”是什么意思?
【发布时间】:2020-05-24 10:12:12
【问题描述】:

这行代码看不懂:

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 &amp;&amp; (i - 1) != 0)。或者干脆if (i != 0 &amp;&amp; i != 1)
  • 你在哪里找到这个代码?这非常奇怪。
  • 好吧,我还没找到,我刚从教授那里得到了那个代码,他让我试着理解它。

标签: c loops for-loop if-statement logical-and


【解决方案1】:

这个if语句的条件

if (i && (i - 1))

为了清晰起见可以重写

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

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

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

所以条件从索引 i 等于 2 开始计算为真。

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

【讨论】:

    【解决方案2】:

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

    这一行:

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

    主要检查ii-1的值是否与0不同。这意味着不会打印数组中的前两个元素,因为对于i=0,我们将得到i,即false,对于i=1,我们将得到(i-1),即@987654332 @

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          循环归结为这一点,

          for (i = 1; i < 6; i++) {
                  printf("%d\n", p[i]);
          }
          

          【讨论】:

          • @UncleBilly:打印来自p[i-1]
          猜你喜欢
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多