在使用 strcmp 针对两个可能值测试字符串的几种给定方法中,其中一种是显而易见的选择吗?

Among several given ways to test a string against two possible values using strcmp, is one of them an obvious choice?

我想针对 "y" 和 "yes" 测试一个字符串,如果是,则做一些事情。 (好吧,不是真的,但这相当于真正的代码。)以下三种在 C 中进行测试的方法在逻辑上是等价的。我很好奇更有经验的程序员会如何在这些可能性中做出选择以及为什么。

if ( strcmp(mystring,"y")==0 || strcmp(mystring,"yes")==0 ) { something(); }

if ( !strcmp(mystring,"y") || !strcmp(mystring,"yes") ) { something(); }

if ( !(strcmp(mystring,"y") && strcmp(mystring,"yes")) ) { something(); }

这些都有利有弊。我也知道最好编写最容易阅读和维护的代码。我不清楚的是,大多数 C 程序员是否会认为第二个比第一个更容易或更容易阅读。如果是这样,那么它较短的长度使其成为三者中的最佳选择。 (第三个读起来似乎特别混乱,所以尽管它的最大操作数较少,但似乎不是最佳选择。)

也许我什至没有考虑过的东西是最好的

if ( strcmp(mystring,"y") && strcmp(mystring,"yes") ) {} else { something(); }

这是非常主观的。

我更喜欢 first 因为它很容易理解:strcmp()==0 表示 等价 (这是很容易理解的对于任何对汇编程序有任何了解的人,您可以通过减去两个寄存器并将结果与​​ 0 进行比较来测试两个寄存器是否相等——至少 CPU 是这样做的)。另一个使用 !strcmp() 的替代方案逻辑倒退,而 !(strcmp() && strcmp()) 是简单的混淆。所有恕我直言。我为此受到批评。

除非一种方法与另一种方法相比存在已知的性能问题,否则始终首选更易于阅读和理解的方法。

鉴于你的三个选择,我肯定会选择:

if ( strcmp(mystring,"y")==0 || strcmp(mystring,"yes")==0 ) { something(); }

更新

您可以定义一个宏,这将有助于使其更加直接和易于阅读。

#define STRING_EQUAL(A, B) (strcmp((A), (B)) == 0)

if ( STRING_EQUAL(mystring,"y") || STRING_EQUAL(mystring,"yes") ) { something(); }

使用宏,让它像自然语言一样。我更喜欢以下方法。维护和可读性更容易。

#define IS_THE_ANS_YES(A) (!strcmp((A),"yes") | !strcmp((A),"y")) ... if (IS_THE_ANS_YES(mystring)) { something(); }