[英]Confusion with operator '!' in c
我见过接线员!
在多个地方以不同的方式使用,我仍然不明白它是如何工作的。 我的基本理解是它将值从真反转为假,反之亦然。 如果它反转为真,则该语句触发。 让我们举个例子。
int main(void)
{
int a = 5;
if (!(a == 6))
{
printf("unlike\n");
}
if (!(a == 5))
{
printf("like\n");
}
}
在上面的代码中,由于a
是5
,它最终打印出“unlike”,因为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
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))
这里i
和j
不相等,因此strcmp
将返回一个非零值,因为i != j
。 所以!(1)
意味着not(1)
意味着0
,所以if
条件是假的,因为为零。 因此它不会执行printf("unlike\n")
行。
(!strcmp(i, k))
这里i
和k
相同,因此strcmp
将返回0
。 !(0)
表示not(0) = 1
,因此if
条件为真。 它将执行printf("like\n")
行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.