! do while 循环中的运算符

! operator in do while loop

我只是在做一个关于 C 中插入排序的教程,我正在努力理解 !运算符用作 do while 循环的条件。

条件只是 while (!done) 但我不明白它是如何知道 what 不应该等于变量 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;
    }
}

谢谢!!

它们完全一样。 !donedone == 0 可以互换。关于 C 的事情是:它很长一段时间没有 "true" 布尔类型。布尔值仅在 C99 中引入。

所有零值都被认为是假的,其他值都是真的。这就是为什么 !done 为真,只要 done == 0done 为 0 -> 假,!false -> true)。 ! 是合乎逻辑的 NOT 运算符,一如既往,并且做它做的事情:否定后面的任何内容。因此 done = 0 => done 是假的,!done -> 假的相反,是真的。

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

False/true 检查 非常 常见:

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

现在这两个句子中哪一个最有道理?