【问题标题】:Algorithm for max and min? (Objective-C)最大值和最小值的算法? (目标-C)
【发布时间】:2012-07-29 16:03:57
【问题描述】:

这是我正在阅读的学习 Objective-C 的书的一部分。

下面定义了一个名为 MAX 的宏,它给出了两个的最大值 值:#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )

然后书中有一些练习要求读者定义一个宏 (MIN) 以找到两个值中的最小值,另一个要求定义一个名为 MAX3 的宏,它给出最大值 3价值观。我认为这两个定义看起来会类似于MAX,但我不明白MAXformula 是如何找到最大值的。我的意思是如果我这样做了

int limits = MAX (4,8)

它只会为 limits 分配值 8。这与找到变量的最大值有什么关系?

【问题讨论】:

  • 请给出书名,以便其他人避免使用 - 没有任何现代的 C/Objective-C/C++ 书籍应该提倡在适合内联函数的情况下使用宏。
  • 逐字阅读。答案就在黄色处:“给出最大 OF 两个值”。只有两个值可供选择,它可以返回的最大值是多少。

标签: objective-c max min


【解决方案1】:

分解:

声明:

#define MAX(a,b)

如果a 大于b,则使用a,否则使用b

( ((a) > (b)) ? (a) : (b) )

然后要创建一个MIN 表达式,使用类似的形式:

#define MIN(a,b) ( ((a) < (b)) ? (a) : (b) )
                        ^

然后要创建一个MAX3 表达式,您可以将它们组合起来:

#define MAX3(a,b,c) ( MAX(a, MAX(b,c)) )

具体来说,此宏旨在与标量(C 内置函数)一起使用,可以使用&lt;&gt; 进行比较。如果你传递了一个 objc 变量,它会导致地址比较,而 MAX 会返回具有更高地址的那个(如果你真的想比较 objc 实例的地址,这是非常罕见的)。

另请注意,这是宏如何咬你的经典示例。使用宏,预处理器简单地扩展(文本复制/粘贴)参数,所以:int limits = MAX (4,8) 字面上扩展为int limits = (4 &gt; 8 ? 4 : 8)。如果你写MAX(x,++y),那么如果y 大于或等于xy 将增加两次,因为它扩展为:int limits = (x &gt; ++y ? x : ++y)

【讨论】:

    【解决方案2】:

    我认为您混淆了值和变量。您列出的宏示例扩展为两个值之间的比较并返回两个值中的较大者(即较大者,ab)。所以你是对的,int limits = MAX(4,8) 只是将8 分配给limits,与找到可以存储在limits 中的最大值无关。

    标头limits.h 定义了许多值,例如INT_MAX,它们将告诉您有关系统上变量类型的最小/最大值的信息。

    【讨论】:

      【解决方案3】:

      最大值算法(Objective-C)

       // get max value
      - (float)maxValue:(NSArray *)arrValue
      {
          float maxValue = 0.0;
          for (NSString *value in arrValue) {
              float compareValue = [value floatValue];
      
              if (compareValue > maxValue) {
                  maxValue = compareValue;
              }
      
          }
      
          return maxValue;
      }
      
      
      NSArray *number=[NSArray arrayWithObjects:[NSNumber numberWithFloat:57.02], [NSNumber numberWithFloat:55.02], [NSNumber numberWithFloat:45.02], nil];
      
      NSLog(@"%f", [self maxValue:number]);
      
      result 57.020000
      

      【讨论】:

        【解决方案4】:

        通常,您将使用 MAX() 或 MIN() 宏来获取一对变量、变量和常数、甚至一对宏常数或其他非字面常量表达式。您通常不会像您在问题中所做的那样提供 2 个文字常量。

        【讨论】:

        • 除非常量是从constexpr 函数或#define 推断出来的...
        猜你喜欢
        • 1970-01-01
        • 2011-03-27
        • 2014-03-22
        • 2013-05-06
        • 2015-05-25
        • 2017-02-13
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多