有一个问题让我在学习哈佛大学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
函数会给出什么价值以及普通单词的正确表达是什么,那就太好了?
!
运算符用于布尔取反。
!0
与1
相同(真)
!1
与0
相同(假)
事实上,每个非零整数在 C 中都是true
的,只有 0 是false
的。
所以,如果strcmp(names[i], "EMMA") == 0
是真的
那么!strcmp(names[i], "EMMA")
也是真的,因为!0
是true
。
此外,如果有人能告诉我什么价值,那就太好了 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
。