与运算符 '!' 混淆在 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");
}
}
在上面的代码中,由于 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 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))
此处 i
和 j
不相等,因此 strcmp
将 return 一个 non-zero 值,因为 i != j
。所以 !(1)
表示 not(1)
表示 0
,因此 if
条件因零而为假。因此它不会执行 printf("unlike\n")
行。
(!strcmp(i, k))
这里 i
和 k
是相同的,所以 strcmp
将 return 0
。 !(0)
表示 not(0) = 1
所以 if
条件为真。它将执行 printf("like\n")
行。
我看到运算符 !
在多个地方以不同的方式使用,但我仍然不明白它的实际工作原理。我的基本理解是它将值从 true 反转为 false,反之亦然。如果它反转为真,则语句触发。举个例子吧。
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 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))
此处 i
和 j
不相等,因此 strcmp
将 return 一个 non-zero 值,因为 i != j
。所以 !(1)
表示 not(1)
表示 0
,因此 if
条件因零而为假。因此它不会执行 printf("unlike\n")
行。
(!strcmp(i, k))
这里 i
和 k
是相同的,所以 strcmp
将 return 0
。 !(0)
表示 not(0) = 1
所以 if
条件为真。它将执行 printf("like\n")
行。