【问题标题】:A More Concise Return Statement更简洁的退货声明
【发布时间】:2016-01-20 05:58:43
【问题描述】:

我最近开始使用 C 进行编程,并且想知道一种更简洁的方法来编写一个简单的函数,该函数根据两个 int 值的相等性返回 1 或 -1。我写的:

int valueCompare(int i, int j) {
    if (i != j) {
        return -1;
    }
    else {
        return 1;
    }
}

它可读但似乎效率低下。我见过使用冒号和问号的返回语句,但是我不熟悉这种风格。有没有人对如何为此编写更有效的函数而不损失可读性有任何建议?

【问题讨论】:

  • 您可以为该逻辑使用三元运算符并编写 return i != j ? -1 : 1;
  • write a simple function that returns 1 or -1 depending on the equality of two int values 只是一个评论,但在C 世界中,返回-11 本质上是一个布尔函数将是一个相当不寻常的设计选择(或要求) .更常见的是返回01(或任何!= 0),在这种情况下,它都会减少到return i == j;
  • @dxiv 感谢您的建设性和有效的批评;你是对的——我应该使用 return 0 或 1 值,因为我的 main 函数确实返回了 0
  • @SadiRubaiyet 非常感谢您命名我想不到的术语(三元运算符)。鉴于使用它的 return 语句的普遍性(从我在 Google 上看到的),我认为这将是将来在我的 C 代码中使用的一个完全可读的选择。
  • '它可读但似乎效率低' - 效率低怎么办?你应该坚持“可读”。编码很容易,测试不太容易,调试很困难。采用减少整体工作的编码风格。 “聪明”的编码通常只是糟糕的编码。

标签: c


【解决方案1】:

你可以使用三元运算符:

int valueCompare(int i, int j) 
{
    return (i == j) ? 1 : -1;
}

【讨论】:

  • 我也是这么说的
  • 问题标题明确指出:“更简洁的退货声明”。这就是它所显示的。
  • 三元运算符很常见。我不同意在这种情况下它的可读性较差。
  • 条件运算符虽然有奇怪的副作用,但不应该盲目地用作“万能药”。考虑以下场景:int a = -1; unsigned int b = 1; long long c = -1; 然后执行if( (true ? a : b) != c) puts("-1 != -1"); 将打印-1 != -1。该错误是由于条件运算符在第二个和第三个操作数之间的不直观提升引起的,无论实际评估的是第二个还是第三个操作数,都会发生这种情况。
【解决方案2】:

为了可读性,考虑重写函数以使用布尔逻辑:

#include <stdbool.h>

bool isEqual (int i, int j) {
  return i == j;
}

在我看来,这是最易读的形式。


或者出于通用编程/可移植性/实用性目的,您应该制作一个 C 编程事实上的标准“函子”以进行价值比较:

int compare_int (const void* i1, const void* i2)
{
  const int* ip1 = i1;
  const int* ip2 = i2;
  return *ip1 - *ip2;
}

这有很多优点:

  • 通用函数格式。
  • 标准。可以传递给bsearch, qsort等函数。
  • 在一个函数中混合相等、小于和大于检查。
  • 与恐龙编译器兼容。

【讨论】:

    【解决方案3】:

    它是可读的,编译器有责任使其高效。任何“聪明”的写作方式都会可读性较差,并且不会更有效率。

    基本上,当只有一个语句时,我会忽略大括号,即使这是一个品味问题:

    if(i != j)
        return -1;
    else
        return 1;
    

    对比

    if(i != j) {
        return -1;
    } else {
        return 1;
    }
    

    对比

    if(i != j)
    {
        return -1;
    }
    else
    {
        return 1;
    }
    

    当然我能想到很多“聪明”的写法

    return (i != j) ? -1 : 1;
    

    这仅适用于 简单 表达式(即这没问题,但抛出几个函数调用将完全不可读)到

    return 2 * (i == j) - 1;
    

    但是这很难读。但是,您应该能够理解它,因为您可能在野外看到这种东西。

    而且绝对没有任何东西可以提高它们的效率。

    【讨论】:

    • 三元运算符很常见。我不同意在这种情况下它的可读性较差。
    • @MitchWheat,如果只是一个简单的比较,是的。但我想这只是一个人为的例子,在实践中会相当复杂。
    • 好吧,我们只能回答提出的问题,而不是一些假设的问题。
    • @MitchWheat,这就是我正在做的事情。回答提出的问题。我只是假设这是一个通用问题,所以我通用回答它。
    • @JanHudec 如果在 if/else if/else 之后只有一个语句,我突然想到大括号是不必要的。谢谢你的提醒!
    【解决方案4】:

    怎么样

    #define SAME_VALUE 1
    #define DIFFERENT_VALUE -1
    

    或者类似的? 还有呢

     int valueCompare (int i, int j){
             return i == j;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2012-10-04
      • 2013-07-11
      • 2022-11-18
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2012-01-02
      相关资源
      最近更新 更多