ABS(A)和abs(int)

时间:2012-07-05 04:28:16

标签: objective-c c xcode function macros

我对这两个在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

5 个答案:

答案 0 :(得分:16)

abs()适用于int,意味着abs(-10.123)将返回10,而ABS()是来自NSObjCRuntime.h的宏,它返回类型为类型的值这个论点。

答案 1 :(得分:6)

NSObjCRuntime.h的ABS定义是:

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

所以它返回带有参数类型的值。 另一方面,abs有原型

int abs (int number)

所以它返回int类型的值。

答案 2 :(得分:3)

ABS()很可能是一个宏,这意味着它是应用程序中某些代码的副本 - 而abs()可能是一个函数。在大多数情况下,请使用该功能,因为如果您在那里包含作业,则没有奇怪的重新发布。

答案 3 :(得分: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'将被调用两次,首先是比较&lt; 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%的机会返回负数!!!

另一方面,如果你想使用stdlib abs()函数,则要警告它不能用于长整数。在这种情况下,您应该使用labs()。

答案 4 :(得分:-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

我希望它有效,谢谢