繁体   English   中英

与运算符“!”混淆在 c

[英]Confusion with operator '!' in c

我见过接线员! 在多个地方以不同的方式使用,我仍然不明白它是如何工作的。 我的基本理解是它将值从真反转为假,反之亦然。 如果它反转为真,则该语句触发。 让我们举个例子。

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 返回值 0,如果不同,则根据字母顺序返回正值或负值。 现在,如果我们按照前面示例中的逻辑,由于 i 和 j 是不同的,并且 false 应该反转为 true,并且不同应该是 output。 但我尝试运行代码,结果是这样的。

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

C 中的 boolean 是 integer,其中零表示假,非零表示真。

当比较的字符串相同时, strcmp返回 0,否则返回非零值,具体取决于差异。 因此, strcmp(i,k)被视为“假”。 ! 然后将其更改为“true”,这将导致您当前的 output。

在第一种情况下a = 5 那么if (!(a == 6)) ; 这里a = 6不是真(假),所以是这样的。 if (!(false))这意味着if (true) 这就是为什么它打印“不同”。

如果字符串 i 和 j 匹配, strcmp(i, j)返回 0; 否则,它将返回一个非零值。 在你的情况下,

(!strcmp(i, j))

这里ij不相等,因此strcmp将返回一个非零值,因为i != j 所以!(1)意味着not(1)意味着0 ,所以if条件是假的,因为为零。 因此它不会执行printf("unlike\n")行。

(!strcmp(i, k))

这里ik相同,因此strcmp将返回0 !(0)表示not(0) = 1 ,因此if条件为真。 它将执行printf("like\n")行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM