我对这两个在 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
我对这两个在 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
abs()
适用于 int,意思abs(-10.123)
是 return 10
,whileABS()
是一个宏,从NSObjCRuntime.h
它返回一个值,其类型是参数的类型。
NSObjCRuntime.h 中的 ABS 定义是:
#define ABS(a) ({typeof(a) _a = (a); _a < 0 ? -_a : _a; })
因此它返回具有参数类型的值。另一方面,abs 有原型
int abs (int number)
所以它返回一个int类型的值。
ABS()
很可能是一个宏,这意味着它是一些代码的复制粘贴到您的应用程序中,而abs()
可能是一个函数。在大多数情况下,请使用该函数,因为如果您在其中包含分配,它不会产生奇怪的影响。
关于使用带有函数参数的宏的警告,例如
#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()。
我们有两种选择
#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
我希望它有效,谢谢