4

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

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

然后书中有一些练习要求读者定义一个宏MINMAX3我认为这两个定义看起来类似于MAX,但我不明白MAX公式如何找到最大值。我的意思是如果我这样做

int limits = MAX (4,8)

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

4

4 回答 4

12

将其分开:

声明:

#define MAX(a,b)

如果a大于b,使用aelse 使用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 内置函数)一起使用,可以使用<or进行比较>。如果您传递了一个 objc 变量,它将导致地址比较,并且 MAX 将返回具有较高地址的那个(如果您真的想比较 objc 实例的地址,这将是非常罕见的)。

另请注意,这是宏如何咬你的经典示例。使用宏,预处理器只需将参数扩展(文本复制/粘贴)到位,因此:int limits = MAX (4,8)从字面上扩展为int limits = (4 > 8 ? 4 : 8). 如果你写MAX(x,++y), then如果大于或等于,y则将增加两次,因为它扩展为:。yxint limits = (x > ++y ? x : ++y)

于 2012-07-29T16:20:58.153 回答
12

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

标题limits.h 定义了许多类似INT_MAX的值,这些值将告诉您有关系统上变量类型的最小/最大值的信息。

于 2012-07-29T16:14:39.110 回答
0

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

于 2012-07-29T16:11:10.700 回答
-1

最大值算法(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
于 2015-04-08T07:19:34.087 回答