与运算符';混淆';在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))