我知道strcmp返回什么,但是我不知道这段代码返回什么。
首先我有这个功能:
static int match_str(const void *str1, const void *str2)
{
return !strcmp((const char *)str1, (const char *)str2);
//if not equal return 1.
}
然后我有这个
if (match_str) return 1; // not equal so return
else{ my code goes on} // equal so continue
我不明白的是,如果str1等于str2,match_str应该返回0。然后代码继续前进。
但它添加了“!”操作员。看起来如果它们等于strcmp = 0,它将返回到“!0”,这意味着“!0 = 1”。但是如果返回到1,则似乎相等。它将停止。
实际上,如果它们相等,它将继续。
我真的感到困惑,为什么“ return!strcmp”而不是“ return strcmp”有效,所以使用“!”的目的是什么?在这里。
谢谢
答案 0 :(得分:1)
来自C标准## 6.5.3.3p5
5逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。表达式!E等效于(0 == E)。
>> What I don't understand is if str1 equals to str2, the match_str should returns 0. and then the code moves on.
由于在返回语句(!
中将strcmp
与return !strcmp(.....)
一起使用,match_str()
将返回1
,如果字符串与{{1 }},如果它们不匹配。
0
如果字符串匹配,>> I really confused why " return !strcmp " works rather than "return strcmp", what is the purpose of using '!' here.
返回strcmp()
,如果不匹配,则返回非零值,因为它按字典顺序比较两个以空值结尾的字符串。函数0
的作者实际上想在字符串匹配的情况下返回match_str()
,并且考虑到这一点,他/他已经给函数命名了(1
)。 match_str
函数的调用者在使用match_str()
函数时应该意识到这一点。
match_str()