与运算符';混淆';在c中
我看到了操作员与运算符';混淆';在c中,c,operators,cs50,C,Operators,Cs50,我看到了操作员在多个地方被不同地使用,我仍然不知道它实际上是如何工作的。我的基本理解是,它将值从真变假,反之亦然。如果它反转为true,则语句将触发。让我们举个例子 int main(void) { int a = 5; if (!(a == 6)) { printf("unlike\n"); } if (!(a == 5)) { printf("like\n"); }
代码>在多个地方被不同地使用,我仍然不知道它实际上是如何工作的。我的基本理解是,它将值从真变假,反之亦然。如果它反转为true,则语句将触发。让我们举个例子
int main(void)
{
int a = 5;
if (!(a == 6))
{
printf("unlike\n");
}
if (!(a == 5))
{
printf("like\n");
}
}
在上面的代码中,因为a
是5
它最终打印“不像”,因为a
是6
的错误语句被颠倒了。现在让我们再举一个例子
int main(void)
{
string i = "abc";
string j = "cab";
string k = "abc";
if (!strcmp(i, j))
{
printf("unlike\n");
}
if (!strcmp(i, k))
{
printf("like\n");
}
}
string
类型取自cs50.h
标题和strcmp
取自string.h
。如果两个字符串相似,则strcmp返回值0;如果两个字符串不同,则根据字母顺序返回正值或负值。现在,如果我们遵循上一个例子中的逻辑,因为i和j是不同的,而false,它应该被反转为true,并且输出应该是不同的。但是我试着运行代码,结果是
我很困惑。谁能给我解释清楚吗?也可以随意使用其他示例。我总是可以不使用代码>但我只想知道它是什么以及如何正确使用它。C中的布尔值是一个整数,假为零,真为非零
strcmp
当比较的字符串相同时返回0,否则根据差异返回非零值。因此,strcmp(i,k)
被视为“假”。
然后将其更改为“true”,这将导致您当前的输出。在第一种情况下a=5
。然后如果(!(a==6))
;这里a=6
不是真(假),所以是这样的if(!(false))
表示if(true)
。这就是为什么它打印“不像”
strcmp(i,j)
如果字符串i和j匹配,则返回0;否则,它将返回一个非零值。就你而言
(!strcmp(i, j))
此处i
和j
不相等,因此strcmp
将返回非零值,因为i!=j
。所以!(1)
表示非(1)
表示0
,因此if
条件因为零而为假。因此,它不会执行printf(“不像\n”)
行
(!strcmp(i, k))
这里的i
和k
是相同的,因此strcmp
将返回0
<代码>!(0)
表示非(0)=1
,因此如果
条件为真。它将执行printf(“like\n”)
行。strcmp(i,j)
返回一个负值,然后应用代码>对它产生0
strcmp(i,k)
返回0
,和!0
是1
。所以它像
@TomKarzes一样打印,但是0不应该是一个真值吗?不,事实上0
是一个标准的假值。非零值为真,零值为假。试试看。执行if(0)
和if(1)
,看看会发生什么。嗯,我很困惑,因为返回0表示程序工作。不要使用代码>使用strcmp()
——尽管很多人都这样做。使用if(strcmp(i,j)==0)
测试是否相等;使用if(strcmp(i,j)!=0)
测试不平等性;使用if(strcmp(i,j)>0)
测试i
是否在j
之后出现;使用如果(strcmp(i,j)>=0)
测试i
是否等于或位于j
之后;使用if(strcmp(i,j)<0)
测试i
是否位于j
之前;使用if(strcmp(i,j)更准确地说,布尔表达式可以被视为零或非零。因为C实际上有一个\u Bool
类型,它只能保存值0或1(false
或true
)。将非零值分配给这样的类型将产生1
。
(!strcmp(i, k))