!操作员在做循环时

sal*_*000 2 c insertion-sort do-while

我只是在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

Eli*_*gem 6

他们完全是一回事.!done并且done == 0可以互换.关于C的事情是:它很长一段时间没有"真正的"布尔类型.布尔人只在C99中引入.

所有零值都被视为false,其他值为true.这就是为什么!done是真的,只要done == 0(done是0 - >假,!false- > true).一如既往地!是逻辑NOT运算符,并且做它的作用:否定后来发生的任何事情.因此done = 0=> done是假的,!done- >与假相反,是真的.

如果你发现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
    // ...
}
Run Code Online (Sandbox Code Playgroud)

TL; DR

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

while done equals zero
//vs
while not done
Run Code Online (Sandbox Code Playgroud)

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