if-else 语句中的“等于”与“不等于”运算符

新手上路,请多包涵

在 C 中编写 if-else 语句时,当两者都可以产生相同的结果时,是否有理由优先使用运算符“等于”而不是“不等于”?

下面的代码提供了上下文。因此,如果参数计数等于 2,则将从用户那里检索一个字符串。但是,如果获得任何其他参数值,则会出现错误消息。

 int main(int argc, string argv[])
{
    string msg;

    if (argc == 2)
    {
        msg = GetString();
    }
    else
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }

但是,我可以通过将 if-else 循环的条件更改为“不等于”并翻转相关操作来实现与上述完全相同的结果。见下文:

 int main(int argc, string argv[])
{
    string msg;

    if (argc != 2)
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }
    else
    {
        msg = GetString();
    }

无论如何,由于两者产生相同的结果,是否应该优先使用其中一个?

原文由 user7011119 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

在 C++ 中有一个技术原因,那就是如果您习惯使用 == 而不是 != ,则不需要重载尽可能多的运算符。

当您处理函数对象(“函子”)时,这很重要。例如,当您使用标准容器类来存储您自己的自定义对象并希望它们自动排序时。为了使函数对象(例如 std::equal_to)工作,您的类只需要重载 == 运算符。您不必超载 ==!= 两者。

同样,其他函数对象只要求您重载 < 而不是全部 < > == != <= >=


一般来说,否定对于人脑来说是不容易理解的。特别是如果你有双重否定。如果顺序在技术上无关紧要,大多数编程语言都习惯先编写相等检查。大多数情况下,它使代码更易于阅读。

但与编程和编码风格一样,没有黑白规则。如果检查的原因是发现错误,那么编写错误处理的最易读的方式优先于“人类发现否定更难阅读”。

考虑一下这个写得不太好的代码:

 if(input == good)
{
  if(format == expected)
  {
    do_stuff();
    return ok;
  }
  else
  {
    return error_format;
  }
}
else
{
  return error_input;
}

想象一下,我们需要为此添加更多错误处理。很常见的情况:假设我们正在编写一个解析器或一些具有大量错误处理的数据协议解码器。多层嵌套大括号很快就会把代码变成一团糟。

如果我们从 == 更改为 !=,我们可以摆脱嵌套 if 语句的需要。

 if(input != good)
{
  return error_input;
}

if(format != expected)
{
  return error_format;
}

// if we got here then all is well
do_stuff();
return ok;

如果我们需要添加更多错误检查,这将更具可读性和可扩展性。因此,通过更改为 != 我们使代码更具可读性。

原文由 Lundin 发布,翻译遵循 CC BY-SA 3.0 许可协议

这只是一个编码风格问题。我讨厌嵌套主要逻辑,我将其写为:

 int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }

    string msg = GetString();
}

顺便说一句: main 的签名应该是 int main(int argc, char *argv[])

原文由 songyuanyao 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题