我对这两个在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
答案 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
我希望它有效,谢谢