什么!运算符的意思是如果放在变量前面?

What does a ! operator mean if put in front of a variable?

我只有一个简单的问题,我正在学习 C 编程并且我知道 !运算符表示逻辑非。我的问题是,在这种情况下,以 do while 循环作为条件意味着什么? 它是否以某种方式检查变量是否已更改?

我知道我可能应该以某种方式找到它,但是当我尝试 google '!' 时,它不想显示我的意思。

#include <stdio.h>

int main() {
    int input, ok=0;
    do {
        scanf("%d", &input);
        if ( /* condition */) {
            //the input is wrong it will scan another one
        }
        else {
            //the input is correct, so the while cycle can stop
            //we don't need more inputs
            ok = 1;
        }
    } while (!ok);

    //...
    //...
    //...

    return 0;
}

在逻辑运算的上下文中,除零 (*) 之外的任何内容都是 true,零是 false

所以!1是“!真”是false
!0 是 "!false" 是 true

(*) 任何类型的零:NULL 算作零,0.0 算作零

笼统地说,给定的代码重复执行循环的内容"while NOT ok",意思是"while OK is zero"。在else块中,ok设置为1,表示循环不再重复。

更正式地说,!ok 是一个表达式,当 ok 等于零时为真,而当 ok 为非零的任何值时为假。

想想看,ok是个布尔值,初始化的时候是false

(在c中,0有一个假值,我假设你知道这一点。)

在do while中,只是对逻辑值求反,还是NOT的意思。如果条件为真,它将循环,否则,不会。

如果 ok 有一个假值,你将否定它,它将有一个真值,循环将,嗯循环。

我希望你能明白我的意思,它没有任何其他含义。

!okok == 0 相同。

请记住,在 C 语言中,布尔上下文中的 任何 非零标量值表示 "true",而零表示 "false"。写 !foo 而不是 foo == 0 是一个常见的 C 习惯用法。它也适用于指针:

FILE *foo = fopen( "some_file", "r" );
if ( !foo )
{
  fprintf( stderr, "could not open some_file\n" );
  return EXIT_FAILURE; 
}

因此,while ( x )while ( x != 0 )相同,while ( !x )while ( x == 0 )相同。