【问题标题】:What does a conditional without a condition mean?没有条件的条件是什么意思?
【发布时间】:2015-12-13 18:21:31
【问题描述】:

我正在尝试阅读一些 C。有一个带有条件的 for 循环似乎不是条件。在 for 循环for (h = n; h /= 2;) 中,条件为h/=2;。但这不是一个真实或虚假的陈述。这是什么意思?这个for循环什么时候结束?

这是来自http://rosettacode.org/wiki/Sorting_algorithms/Shell_sort#C的完整代码:

#include <stdio.h>

void shell_sort (int *a, int n) {
    int h, i, j, t;
    for (h = n; h /= 2;) {
        for (i = h; i < n; i++) {
            t = a[i];
            for (j = i; j >= h && t < a[j - h]; j -= h) {
                a[j] = a[j - h];
            }
            a[j] = t;
        }
    }
}

int main (int ac, char **av) {
    int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1};
    int n = sizeof a / sizeof a[0];
    int i;
    for (i = 0; i < n; i++)
        printf("%d%s", a[i], i == n - 1 ? "\n" : " ");
    shell_sort(a, n);
    for (i = 0; i < n; i++)
        printf("%d%s", a[i], i == n - 1 ? "\n" : " ");
    return 0;
}

【问题讨论】:

  • 在表达式之后想象!= 0
  • C 没有强布尔数据类型。在 C99 及更高版本中有_Bool,但即使这只是一个整数类型。在 C 中,任何计算结果为零的整数表达式都表示假,而任何其他整数表达式都表示真。反过来说,关系表达式的计算结果为整数值(0 或 1,视情况而定),并且可以这样使用。

标签: c for-loop conditional conditional-statements


【解决方案1】:

它将在执行增强赋值运算符/= 后计算h,它将h 除以第二个操作数并将结果分配回h
h 为 0 时,条件将失败。

一个更易读的等价物是

int h = n, i, j, t;
while (h /= 2) {
    ...
}

for(h = n / 2; h; h /= 2) { ... } 也是等价的,但是为了有一个 for 循环而重复初始化中的增量显然很麻烦。

【讨论】:

    【解决方案2】:

    声明

    h /= 2;
    

    h 除以2,将该新值分配给h,然后计算该新值。因此,一旦h 由于重复除以 2 而变为 0(最终会),条件将变为 false,循环将结束。

    【讨论】:

    • 那么你是说它相当于:for(h = n / 2; h != 0; h /= 2)?
    • 不完全是因为h 在循环体内会有不同的值,但迭代次数是相同的。
    • @Evorlor 对不起,我的错。是的,完全一样。
    • @Evorlor 抱歉,误读了您的第一条评论。是的,它相当于那个。或者int h = n; while(h /= 2) {}哪个IMO更清楚
    【解决方案3】:

    如果某事为0,则为假,如果某事不为0,则为真。

    所以 h/= 2 会一直除 h 直到达到 0,然后退出循环

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2012-12-13
      • 2023-02-09
      • 2020-04-01
      相关资源
      最近更新 更多