stu*_*ped 4 objective-c max min
这是我正在阅读的学习Objective-C的书的一部分.
下面定义了一个名为MAX的宏,它给出了最多两个值:
#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
然后书中有一些练习要求读者定义一个宏(MIN)来找到两个值中的最小值,另一个要求定义一个被称为MAX3最多给出3个值的宏.我认为这两个定义看起来很相似MAX,但我不明白MAX公式如何找到最大值.我的意思是,如果我这样做
int limits = MAX (4,8)
Run Code Online (Sandbox Code Playgroud)
它只会赋值limits8.这与查找变量的最大值有什么关系?
小智 12
我认为你是混淆价值和变量.您列出的宏示例扩展为两个值之间的比较,并返回两个值中较大的一个(即哪个更大,a或b).所以,你是对的,int limits = MAX(4,8)只是分配8到limits与无关与发现,你可以在存储的最大值limits.
标题limits.h定义了许多值INT_MAX,这些值将告诉您有关系统上变量类型的最小值/最大值的信息.
jus*_*tin 12
打破它:
声明:
#define MAX(a,b)
Run Code Online (Sandbox Code Playgroud)
如果a大于b,请使用aelse b:
( ((a) > (b)) ? (a) : (b) )
Run Code Online (Sandbox Code Playgroud)
然后创建MIN表达式,使用类似的形式:
#define MIN(a,b) ( ((a) < (b)) ? (a) : (b) )
^
Run Code Online (Sandbox Code Playgroud)
然后要创建MAX3表达式,您可以将它们组合在一起:
#define MAX3(a,b,c) ( MAX(a, MAX(b,c)) )
Run Code Online (Sandbox Code Playgroud)
具体来说,这个宏旨在与标量(C builtins)一起使用,可以使用<或者进行比较>.如果你传递一个objc变量,它将导致地址的比较,MAX将返回一个具有更高地址的变量(如果你真的想要比较objc实例的地址,这将是非常罕见的).
另请注意,这是宏如何咬你的典型例子.使用宏,预处理器只需扩展(文本复制/粘贴)参数,因此:int limits = MAX (4,8)字面上扩展为int limits = (4 > 8 ? 4 : 8).如果你写MAX(x,++y),那么y如果y大于或等于,则会增加两次x因为它扩展为:int limits = (x > ++y ? x : ++y).