5

xcode の ABS(A) と abs(int) のこの 2 つの違いに困惑しています。オンラインでも説明が見つからないようです。どちらを使用する必要がありますか? 私は実際に加速度計に取り組んでいます。ABS(A) と abs(int) を使用すると、2 つの異なる値が得られます。abs(int) を使用すると inf 値になることがありますが、ABS(A) を使用すると別の値が得られますが、inf は得られません。ありがとう!

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

4

5 に答える 5

16

abs()int で機能します。つまり、abs(-10.123)が返されます。10一方、 は引数の型と同じ型の値を返すABS()マクロです。NSObjCRuntime.h

于 2012-07-05T04:43:14.877 に答える
6

NSObjCRuntime.hからのABS定義は次のとおりです。

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

したがって、引数の型とともに値を返します。一方、腹筋にはプロトタイプがあります

int abs (int number)

したがって、int型の値を返します。

于 2012-07-05T07:38:11.990 に答える
3

ABS()ほとんどの場合マクロです。これは、アプリケーションへのコードのコピーパスタであることを意味しますabs()が、おそらく関数です。ほとんどの場合、関数を使用してください。そこに代入を含めても、奇妙な再帰はありません。

于 2012-07-05T04:30:32.340 に答える
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'は2回呼び出されます。1回目は比較<0の場合、2回目は結果-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()を使用する必要があります。

于 2012-10-04T09:29:43.487 に答える
-1

2つの選択肢があります

#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

うまくいくことを願っています、ありがとう

于 2016-09-19T13:48:31.420 に答える