这是我正在阅读的学习 Objective-C 的书的一部分。
下面定义了一个名为 MAX 的宏,它给出了两个值的最大值:
#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
然后书中有一些练习要求读者定义一个宏MIN(MAX3我认为这两个定义看起来类似于MAX,但我不明白MAX公式如何找到最大值。我的意思是如果我这样做
int limits = MAX (4,8)
它只会分配limits值 8。这与找到变量的最大值有什么关系?
这是我正在阅读的学习 Objective-C 的书的一部分。
下面定义了一个名为 MAX 的宏,它给出了两个值的最大值:
#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
然后书中有一些练习要求读者定义一个宏MIN(MAX3我认为这两个定义看起来类似于MAX,但我不明白MAX公式如何找到最大值。我的意思是如果我这样做
int limits = MAX (4,8)
它只会分配limits值 8。这与找到变量的最大值有什么关系?
将其分开:
声明:
#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)
我认为您混淆了价值和变量。您列出的宏示例扩展为两个值之间的比较,并返回两个值中的较大者(即较大者a或b)。所以你是对的,int limits = MAX(4,8)只是分配8给limits并与找到你可以存储的最大值无关limits。
标题limits.h 定义了许多类似INT_MAX的值,这些值将告诉您有关系统上变量类型的最小/最大值的信息。
通常,您将使用 MAX() 或 MIN() 宏来获取一对变量、一个变量和一个常量、甚至一对宏常量或其他非文字常量表达式中较高/较低的那个. 您通常不会像您在问题中所做的那样提供 2 个文字常量。
最大值算法(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