5

我对这两个在 xcode、ABS(A) 和 abs(int) 中的区别感到困惑。似乎也无法在网上找到任何解释。我应该使用哪个?我实际上正在研究加速度计。使用 ABS(A) 和 abs(int) 给了我两个不同的值。使用 abs(int) 有时会产生一个 inf 值,而 ABS(A) 会给我一个不同的值,但绝不会是 inf。谢谢!

http://www.switchonthecode.com/tutorials/iphone-tutorial-reading-the-accelerometer

4

5 回答 5

16

abs()适用于 int,意思abs(-10.123)是 return 10,whileABS()是一个宏,从NSObjCRuntime.h它返回一个值,其类型是参数的类型。

于 2012-07-05T04:43:14.877 回答
6

NSObjCRuntime.h 中的 ABS 定义是:

#define ABS(a) ({typeof(a) _a = (a); _a < 0 ? -_a : _a; })

因此它返回具有参数类型的值。另一方面,abs 有原型

int abs (int number)

所以它返回一个int类型的值。

于 2012-07-05T07:38:11.990 回答
3

ABS()很可能是一个宏,这意味着它是一些代码的复制粘贴到您的应用程序中,而abs()可能是一个函数。在大多数情况下,请使用该函数,因为如果您在其中包含分配,它不会产生奇怪的影响。

于 2012-07-05T04:30:32.340 回答
0

关于使用带有函数参数的宏的警告,例如

#include <stdio.h>
#define BAD_ABS(A) ((A)<0 ? (-(A)):(A))
int     afunc(){
    printf("afunc was called\n");
    return 1;
}
int     main(void){
    int     a;
    a = BAD_ABS(afunc());
    /* this has the result of:
    a = (afunc()<0) ? (-(afunc())) : (afunc());
    */
}

函数 'afunc' 将被调用两次,第一次用于比较 <0,第二次用于返回结果 -A 或 A。

NSObjCRuntime.h 中的 ABS 宏的定义方式通过引入一个额外的变量来避免这种情况,但一些 DIY 宏可能不会,例如我在几个地方看到过

 #define BAD_ABS(a) ((a)<0 ? (-(a)) : (a))

如果要调用的函数是随机数生成器,情况会变得更糟,例如

#include <stdio.h>
#include <stdlib.h>
int main(void){
   short seeds[] = {1,2,3};
   int i;
   for(i=0;i<10000;i++) printf("%ld\n", BAD_ABS(jrand48(seeds)));
}

这有 50-50 的机会返回负数!!!

另一方面,如果您想使用 stdlib abs() 函数,请注意它不适用于长整数。在这种情况下,您应该使用 labs()。

于 2012-10-04T09:29:43.487 回答
-1

我们有两种选择

#define ABS(a) ({typeof(a) _a = (a); _a < 0 ? -_a : _a; })

在 Swift 2 中使用

Int32 abs(Int32) which has a return type Int32
T abs(T) which has a return type T where T is a generic type

我希望它有效,谢谢

于 2016-09-19T13:48:31.420 回答