2012-07-05 2 views
4

Я сбив с толку в разнице этих двух в xcode, ABS (A) и abs (int). Возможно, Cant не нашел и никакого объяснения в Интернете. Что я должен использовать? Я фактически работаю на акселерометре. Использование ABS (A) и abs (int) дает мне два разных значения. Использование abs (int) приведет к появлению значения inf за раз, в то время как ABS (A) даст мне другое значение, но никогда инф. Благодаря!ABS (A) и abs (int)

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

ответ

15

abs() работает на междунар, что означает abs(-10.123) вернется 10, в то время как ABS() макрос из NSObjCRuntime.h который возвращает значение, тип которого является тип аргумента.

+2

Ahhhh. Я вижу! СПАСИБО! Так ли я прав, что abs (int) всегда возвращал целое число? – Hexark

+0

@Hexark, да, это – Habib

3

ABS() скорее всего макрос, а это означает, что это копия-паста некоторого кода в приложения, в то время как abs(), вероятно, является функцией. В большинстве случаев используйте эту функцию, так как она не имеет каких-либо нечетных переквалификаций, если вы включите в нее назначение.

6

Определение АБС из NSObjCRuntime.h является:

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

поэтому он возвращает значение с типом аргумента. абс с другой стороны, имеет Protoype

int abs (int number) 

так возвращает значение типа Int.

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 определен избегает этого, вводя дополнительную переменную, но некоторые макросы 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().

-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 

Я надеюсь, что это работает, спасибо

+0

Вопрос отмечен ObjectiveC, вы предоставляете ответ в Swift. –

+0

Конечно, вопрос отмечен в Objective C, но он полезен в Swift right ..AnyWays спасибо за вниз Голосование, но люди могут использовать мой ответ в swift –

+0

Правильно, но ваш ответ по-прежнему неуместен, поскольку он не имеет отношения к вопросу. –