与运算符 '!' 混淆在 c

Confusion with operator '!' in c

我看到运算符 ! 在多个地方以不同的方式使用,但我仍然不明白它的实际工作原理。我的基本理解是它将值从 true 反转为 false,反之亦然。如果它反转为真,则语句触发。举个例子吧。

int main(void)
{
    int a = 5;
    if (!(a == 6))
    {
        printf("unlike\n");
    }
    if (!(a == 5))
    {
        printf("like\n");
    }
}

在上面的代码中,由于 a5,它最终打印出“unlike”,因为 a6 的错误陈述被推翻了。再举个例子

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 header 和 strcmp 来自 string.h。 strcmp returns 如果两个字符串相似则值为 0,如果不同则取决于字母顺序 returns 为正值或负值。现在,如果我们遵循前面示例中的逻辑,因为 i 和 j 不同,并且 false 应该反转为 true 并且 unlike 应该是输出。但是我试了 运行 代码,结果是这样的。

我很困惑。任何人都可以向我解释清楚吗?也可以随意使用其他示例。我总是可以不使用 ! 但我只想了解它是什么以及如何正确使用它。

C 中的布尔值是一个整数,零表示假,non-zero 表示真。

strcmp returns 当比较的字符串相同时为 0,否则为 non-zero 值取决于差异。因此,strcmp(i,k) 被视为“假”。 ! 然后将其更改为“true”,这将导致您当前的输出。

第一种情况a = 5。然后 if (!(a == 6));这里 a = 6 不是真(假),所以是这样的。 if (!(false))表示if (true)。这就是它打印“不像”的原因。

strcmp(i, j) returns 0 如果字符串 i 和 j 匹配;否则,它将 return 一个 non-zero 值。在你的情况下,

(!strcmp(i, j))

此处 ij 不相等,因此 strcmp 将 return 一个 non-zero 值,因为 i != j。所以 !(1) 表示 not(1) 表示 0,因此 if 条件因零而为假。因此它不会执行 printf("unlike\n") 行。

(!strcmp(i, k))

这里 ik 是相同的,所以 strcmp 将 return 0!(0) 表示 not(0) = 1 所以 if 条件为真。它将执行 printf("like\n") 行。