2012-07-05 84 views

回答

15

abs()作品的INT,意爲abs(-10.123)將返回10,而ABS()NSObjCRuntime.h宏返回類型爲參數的類型的值。

+2

哈啊。我懂了!謝謝!那麼我說abs(int)總是會返回一個整數嗎? – Hexark

+0

@Hexark,是的,它確實 – Habib

3

ABS()是最有可能的一個宏,這意味着它的一些代碼到你的應用程序副本,麪食,而abs()可能是一個功能。在大多數情況下,請使用該功能,因爲如果您在其中包含任務,它就不會有任何怪異的反應。

6

從NSObjCRuntime.h的ABS的定義是:

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

所以它與參數的類型返回該值。 ABS在另一方面具有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的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()函數,那麼應該警告它不適用於長整數。在這種情況下,你應該使用實驗室()。

-1

我們在斯威夫特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 

我希望它的工作原理兩種選擇

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

,感謝

+0

這個問題被標記爲ObjectiveC,你在Swift中提供了一個答案。 –

+0

Ofcourse該問題在Objective C中被標記,但它在Swift中很有用..無論如何感謝您的投票,但是人們可以很快地使用我的答案 –

+0

正確,但您的答案仍然不合適,因爲它與問題無關。 –