【问题标题】:Puzzled about for loops in C对 C 中的 for 循环感到困惑
【发布时间】:2017-05-03 19:07:27
【问题描述】:

为了清楚起见,我了解 for 循环的工作原理。但是,不同的语法给我带来了问题......让我举个例子:

我正在查找递归排序算法(插入排序)。代码是这样的:

void insertion_recursive(int array[],int size){
int i;

if (size<=1) return;

insertion_recursive(array,size-1);

for(i=size-1;i;i--)
   if(array[i]<array[i-1])
       swap(&array[i],&array[i-1]);
   else
       break;
}

我了解代码的工作原理,但循环的条件让我感到困惑:

for(i=size-1 ; i ; i--)

这是什么意思?只留下'i'而不指定条件?

【问题讨论】:

  • 但它确实有条件!就像if (i)... 一样。
  • 0 为“假”,任何其他值为“真”。
  • 我了解 for 循环的工作原理 - 如果你这样做了,你就不会问这个问题。当i 为零时为假,否则为真
  • @EdHeal 他的问题不直接处理循环......更多的是关于i 本身(没有任何明确条件)如何被解释为条件的语义。
  • ifor 语句中时,请说明为什么它是间接的

标签: c loops sorting recursion insertion-sort


【解决方案1】:

在 C 中,当尝试评估一个条件时,所有为 0 的都是假的,而其他的都是真。

甚至指针也以同样的方式处理。常量 NULL 实际上定义为 0。在 C++11 中,我们终于有了用于类型安全的 null_ptr。

在 C 中没有 bool 类型,而在 C++ 中,如果将 true 转换为整数,则得到 1,而 false 转换为 0。

【讨论】:

    【解决方案2】:

    一个表达式代表一个数据项——通常是一个数字。表达式可以由单个实体组成,例如constantvariable,也可以由这些实体的某种组合组成,由一个或多个运算符互连。表达式还可以表示truefalse 的逻辑条件。但是,在 C 中,条件truefalse 分别由非零整数值和零整数值表示。下面给出几个简单的表达式:

    a + b
    x = y
    t = u + v
    x <= y
    ++j
    

    在您的示例中,i 是一个表达式,其值为表达式的l-value,在这种情况下,它是变量i 的值。 对于非零 i 值,表达式将计算为 true,如果 i 的值为零,则计算结果为 false

    所以,for(i=(size-1); i ; i--) 等价于 for(i=(size-1); i != 0; i--)

    【讨论】:

    • 我明白了,对于任何非零值,条件评估为真......我不知道这一点。所以这也应该有效: for(i=size-1 ; i>0 ; i--)
    【解决方案3】:

    i 本身被转换为布尔值,类似于if (i) {...}if (! i) {...};整数在非零时被认为是true,在零时被认为是false

    所以,for(i=size-1 ; i ; i--) 等价于 for(i=size-1 ; i != 0; i--)

    【讨论】:

    • C 是否将事物转换为布尔值?
    • 这是一个反问
    • i 本身不会转换为布尔值。
    猜你喜欢
    • 2016-07-13
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多