我對這兩個在xcode,ABS(A)和abs(int)中的區別感到困惑。不可能在網上找到一個解釋。我應該使用哪個?我實際上是在加速度計上工作。使用ABS(A)和abs(int)給了我兩個不同的值。使用abs(int)有時會產生一個inf值,而ABS(A)會給我一個不同的值但從不inf。謝謝!ABS(A)和abs(int)
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。謝謝!ABS(A)和abs(int)
http://www.switchonthecode.com/tutorials/iphone-tutorial-reading-the-accelerometer
abs()
作品的INT,意爲abs(-10.123)
將返回10
,而ABS()
爲NSObjCRuntime.h
宏返回類型爲參數的類型的值。
ABS()
是最有可能的一個宏,這意味着它的一些代碼到你的應用程序副本,麪食,而abs()
可能是一個功能。在大多數情況下,請使用該功能,因爲如果您在其中包含任務,它就不會有任何怪異的反應。
從NSObjCRuntime.h的ABS的定義是:
#define ABS(a) ({typeof(a) _a = (a); _a < 0 ? -_a : _a; })
所以它與參數的類型返回該值。 ABS在另一方面具有protoype
int abs (int number)
所以它返回int類型的值。
關於使用具有函數參數的宏的警告詞,例如
#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()函數,那麼應該警告它不適用於長整數。在這種情況下,你應該使用實驗室()。
我們在斯威夫特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; })
,感謝
這個問題被標記爲ObjectiveC,你在Swift中提供了一個答案。 –
Ofcourse該問題在Objective C中被標記,但它在Swift中很有用..無論如何感謝您的投票,但是人們可以很快地使用我的答案 –
正確,但您的答案仍然不合適,因爲它與問題無關。 –
哈啊。我懂了!謝謝!那麼我說abs(int)總是會返回一個整數嗎? – Hexark
@Hexark,是的,它確實 – Habib