1

我只是对 strcmp、stricmp、compare 等有某种基本的感知问题。我知道他们做什么,我知道他们为什么这样做,但是当我检查相等性时,我只是自然地写“if (strcmp())。 ..” 这对我来说是逆向逻辑,我只是​​没有想到(直到后来我的代码块不起作用时)写“if (0==strcmp())...”。我一直这样做,它减慢了我的发展。有人有提示可以扭转我的想法吗?

就像我需要将函数命名为“strdoesntcmp”......(是的,我知道它不能用于小于或大于这种方式......)。当然,我可以使用#define 或 inline 来做这样的事情,但那是一个技巧......如果这有意义的话,我只想扭转我对它的自然想法......

4

4 回答 4

4

最好的答案是完全忘记strcmp

std::string s1 = "one";
std::string s2 = "two";
if (s1 == s2) // ...

编辑:如果您熟悉汇编,则该strcmp功能根本不会让您感到困惑。许多处理器都有一个CMP指令,可以在不存储结果的情况下对两个值进行减法运算,它只是设置条件标志,告诉您结果是负数、零还是正数。strcmp只是用字符串模拟同样的事情。

于 2012-09-10T19:03:18.633 回答
4
int streq( char const* s1, char const* s2)
{
    return 0 == strcmp(s1, s2);
}

inline如果性能开销困扰您。

于 2012-09-10T19:03:59.820 回答
2

试想一下,这种比较实际上是减法(微处理器指令也以这种方式工作)。所以strcmp可能被称为strsub,并且以这种方式零意味着字符串相等。

strcmp自行实施规范。当你解决它时,返回值会像1x1.

您也可以认为,一旦您发布到 stackOverflow,您总是会忘记(0==strcmp)并且得到很多令人困惑的答案。一旦你记住了这一点,你的头脑就不会再误认为compare操作员不是equality操作员了。

于 2012-09-10T19:03:57.013 回答
0

它不像您希望的那样直观的原因是因为您想使用它来比较字符串 == 或 !=。这不是 strcmp 函数的全部意义。关键是它可以返回str1 > str2, str1 == str2, 或者str1 < str2您可以出于不同的原因使用这些不同的返回。

如果您真的无法将它们直接记在脑海中,并且您使用此功能进行 == 或 != 类型的比较,您可以随时为自己反转它:

#define strcmp !strcmp

然后它会按照你想要的方式工作,但正如我所提到的,你这样做会失去功能。

于 2012-09-10T19:12:13.387 回答