C语言中的感叹号和strcmp函数
在学习哈佛大学CS50课程的过程中,有一个问题让我感到困惑。以下是困扰我很久的问题 对于下面的代码,它希望将名为“EMMA”的字符串与名为“names”的数组进行比较,其中包含4个名称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"
#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
前面使用感叹号。我不知道为什么在第二种方法中它也会给出相同的输出,尽管我已经查阅了functionstrcmp
的定义
此外,如果有人能告诉我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评论中,它节省了一些工作:)先生,我非常感谢!