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

C语言中的感叹号和strcmp函数,c,cs50,boolean-expression,strcmp,C,Cs50,Boolean Expression,Strcmp,在学习哈佛大学CS50课程的过程中,有一个问题让我感到困惑。以下是困扰我很久的问题 对于下面的代码,它希望将名为“EMMA”的字符串与名为“names”的数组进行比较,其中包含4个名称 #include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { // An array of names string names[] = {"EMMA", "RODRIGO"

在学习哈佛大学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;
}
#包括
#包括
#包括
内部主(空)
{
//名称数组
字符串名[]={“EMMA”、“RODRIGO”、“BRIAN”、“DAVID”};
//搜寻艾玛
对于(int i=0;i<4;i++)
{
if(strcmp(名称[i],“EMMA”)==0)
{
printf(“找到的”\n);
返回0;
}
}
printf(“未找到”);
返回1;
}
在上述代码中,它使用
if(strcmp(名称[i],“EMMA”)==0)
检查名称“EMMA”

但是,如果我用另一种方式编写代码,比如用
if(!strcmp(names[I],“EMMA”)==0)替换
if(!strcmp(names[I],“EMMA”))
,它也会运行,结果是相同的答案“Found”

如果我没记错的话,感叹号
在C中表示“不”。在第一种方法中,它使用两个等号来表示与0相同的值。但是在第二种方法中,它在函数
strcmp
前面使用感叹号。我不知道为什么在第二种方法中它也会给出相同的输出,尽管我已经查阅了function
strcmp
的定义


此外,如果有人能告诉我strcmp函数的值是多少,用简单的话来说正确的表达方式是什么,那就太好了运算符用于布尔求反

!0
1
相同(true)

!1
0
相同(假)

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

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

然后
!strcmp(名称[i],“EMMA”)
也是正确的,因为
!0

此外,如果有人能告诉我价值是多少,那就太好了 strcmp函数给出了 简单的话

看看这个

总之,

strcmp
可以返回三个可能的值:

0,如果两个字符串相等

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


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

,则如果两个字符串相同,
strcmp
函数返回0,否则返回正整数或负整数。第二种方法也可以工作的原因是C(和许多其他语言)的一个属性,其中即使值的类型为integer,也可以强制为boolean(true或false)类型。这意味着,当您执行
!0
您将获得值
true
,因为0的计算结果为
false
,并应用
操作员将其翻转为
true
。除0之外的任何整数值(无论是正值还是负值)都将产生值
true
,例如,
!1
将导致
错误
,因为
错误
翻转该值。

答案在您的问题中,
strcmp
将在字符串不同时返回非零值,在字符串相等时返回零

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

看看这个

int a=1;
while(a)
{
//do something
}
上面的示例表示在
a=0
如果您使用此

int a=1;
while(!a)
{
//do something
}
这意味着在
a==0时运行


如果(!strcmp(names[i],“EMMA”)
是布尔值,则此
。上面写着如果
!strcmp(名称[i],“EMMA”)
为真输入语句,表示如果
!0发生在输入语句时,因为
!false
相当于
true

一元
运算符对其操作数执行逻辑“not”运算<代码>!x
相当于
x==0
。这是基本布尔代数,与字符串无关。在C中,所有不是零的东西都被视为“真”。意思是
!如果“whater”非零,则whater
等于0。差不多就这些了。谢谢汤姆和伦丁,这很有用!我建议补充一点,每个非零值都被视为“真”,0被视为“假”,例如
!3
-3
也将导致
0
@Bodo-Yah即使我感觉如此,我基本上还是写了一个快速的答案:P我现在就编辑谢谢,先生!这对我帮助很大,也澄清了我的困惑。先生,你的回答也让我对strcmp的功能有了更多的了解。我非常感激@瑞奇,我没问题,汉尼,我非常感激!OP用“先生”称呼我们所有人,但这里有什么特别的?Lol@anastaciu是的,但我的观点是OP应该用“夫人”而不是“哈尼”,如果是这样的话,有些可疑haha@Ardent编码器,因为我无法区分性别哈哈。让我纠正它。夫人,我非常感谢!我建议,
谢谢女士们先生们
在OP评论中,它节省了一些工作:)先生,我非常感谢!