C语言中的感叹号和`strcmp`函数

The Exclamation Notation and `strcmp` Function in C programming

在学习哈佛大学CS50课程的过程中,有一个问题让我很困惑。以下是困扰我很久的问题

对于下面的代码,它想要将名为 "EMMA" 的字符串与名为 "names" 的数组进行比较,其中包含 4 个名称。

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    // An array of names
    string names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};

    // Search for EMMA
    for (int i = 0; i < 4; i++)
    {
        if (strcmp(names[i], "EMMA") == 0)
        {
            printf("Found\n");
            return 0;
        }
    }
    printf("Not found\n");
    return 1;
}

在上面的代码中,它使用if (strcmp(names[i], "EMMA") == 0)来检查名称"EMMA"。

但是,如果我用另一种方式编写代码,就像我将 if (strcmp(names[i], "EMMA") == 0) 替换为 if (!strcmp(names[i], "EMMA")),它也会 运行,结果是相同的答案 "Found".

如果我没记错的话,C 中的感叹号 ! 表示 "NOT"。在第一种方法中,它使用两个等号来表示与0相同的值。而在第二种方法中,它在函数前面使用感叹号strcmp。我不熟悉为什么它在第二种方法中也给出相同输出的含义,即使我已经查找了函数 strcmp.

的定义

此外,如果有人能告诉我 strcmp 函数会给出什么值,以及用普通话表达什么才是正确的表达方式,那就太好了?

! 运算符用于布尔取反。

!01 相同(真)

!10 相同(假)

事实上,每个非零整数在C中都是true,只有0是false

因此,如果 strcmp(names[i], "EMMA") == 0 为真

那么!strcmp(names[i], "EMMA")也成立因为!0true.

Moreover, it would be great if someone could tell me what value would the strcmp function gives and what is the proper expression in the plain words?

检查此 link

简而言之,

strcmp 可以 return 三个可能的值:

0,如果两个字符串相等

一个正整数,如果第一个字符串大于第二个字符串

一个负整数,如果第一个字符串小于第二个字符串

如你所见herestrcmp函数returns如果两个字符串相同则返回0,否则returns要么是正整数要么是负整数。第二种方法也有效的原因是由于 C(以及许多其他语言)的 属性,即使值具有整数类型,它也可以被强制转换为布尔(true 或 false)类型。这意味着,当您执行 !0 时,您将获得值 true,因为 0 的计算结果为 false 并应用 ! 运算符将其翻转为 true.任何非 0 的整数值(无论是正数还是负数)都将导致值 true,因此例如 !1 将导致 false,因为 ! 翻转值。

答案在你的问题中,如果字符串不同,strcmp 将 return 为非零值,如果它们相等,则为零。

如果将 ! 逻辑否定运算符应用于 0,它将计算为 true,如果将其应用于非零值,它将计算为 false, 因此条件在两种方法中具有相同的逻辑值。

看看这个

int a=1;
while(a)
{
//do something
}

上面的例子意味着 运行 而 a!=0 如果你使用这个

int a=1;
while(!a)
{
//do something
}

这意味着 运行 而 a==0

这个 if(!strcmp(names[i], "EMMA")) 是一个布尔值。这表示如果 !strcmp(names[i], "EMMA") 为真,则输入语句,这意味着如果 !0 发生,则输入语句,因为 !false 等同于 true.