C 编程中的感叹号表示法和"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", "BRIAN", "DAVID"};
// Search for EMMA
for (int i = 0; i < 4; i++)
{
if (strcmp(names[i], "EMMA") == 0)
{
printf("Foundn");
return 0;
}
}
printf("Not foundn");
return 1;
}

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

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

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

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

!运算符用于布尔取反。

!01相同(真)

!10相同(假)

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

所以,如果strcmp(names[i], "EMMA") == 0是真的

那么!strcmp(names[i], "EMMA")也是真的,因为!0true

此外,如果有人能告诉我什么价值,那就太好了 strcmp 函数给出的以及 平白的话?

检查此链接。

总之

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

0,如果两个字符串相等

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

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

正如你在这里看到的,如果两个字符串相同,strcmp函数返回 0,否则它返回一个正整数或负整数。第二种方法也起作用的原因是由于 C(以及许多其他语言)的属性,即使值具有整数类型,也可以强制转换为布尔(真或假)类型。这意味着,当你执行!0时,你会得到值true,因为 0 的计算结果为false,应用!运算符将其翻转为true。除 0 以外的任何整数值(无论是正值还是负值)都将导致值true,因此例如,!1将导致false,因为!翻转了该值。

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

如果将逻辑否定运算符应用于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

最新更新