!操作员在做循环时

时间:2017-04-03 10:50:26

标签: c do-while insertion-sort

我正在做一个关于C中插入排序的教程,我很难理解它的方式!运算符用作do while循环的条件。

条件只是while (!done),但我不明白它是如何知道 不应该等于已完成的变量。像while (done==0)这样的东西对我来说更有意义。

我只是开始编码,如果答案非常明显,那就很抱歉!我试过谷歌搜索但我发现很难表达问题......

代码如下:

void insertionSortArray (int arr[])
{
    for(int i = 1; i < SIZE; i++)
    {
        int value = arr[i];
        int j = i -1;
        int done = 0;
        do
        {
            if (arr[j]>value)
            {
                arr [j+1] = arr[j];
                j - -;
                if (j<0)
                done = 1;
            }

            else
                done = 1;

        } while (!done);

        arr [j+1] = value;
    }
}

谢谢!

1 个答案:

答案 0 :(得分:6)

他们完全是一回事。 !donedone == 0可以互换。关于C的事情是:它很长时间没有&#34; true&#34; 布尔类型。布尔人只在C99中被引入。

所有零值都被视为false,其他值为true。这就是为什么!done为真的原因,只要done == 0done为0 - &gt; false,!false - &gt; true) 。 !一如既往地是逻辑 NOT 运算符,并执行它所做的事情:否定之后发生的任何事情。因此done = 0 =&gt; done为假,!done - &gt;与假相反,是真实的。

如果您发现done == 0更容易阅读,那么一定要这样写。虽然,更常见的是看到更短的版本。

非常常见的错误/真实检查:

type *foo = malloc(123 * sizeof *foo);
if (!foo)
    exit(1); // failed to alloc memory

void my_function(int *ptr, size_t size)
{
    if (!ptr)
        return; // a NULL pointer was passed
    // ...
}

TL; DR

因为两个陈述都是可以互换的,所以写下你认为最有意义的东西。或许大声朗读这两个陈述(虽然看起来很愚蠢)会让你改变主意:

while done equals zero
//vs
while not done

现在两句话中哪一句最有意义?