15

私はこれをいつも見ています:

CGFloat someCGFloat = 1.2f;

なぜ「f」が使用されるのですか?CGFloatがとして定義されている場合float、値はに変換され、floatCGFloatとして定義されているdouble場合、値はに変換されますdouble

doubleからへの変換floatが発生しないようにするためだけですか?それをする意味は何ですか?また、コンパイラはこれを処理しませんか?

編集:うーん...どちらが受け入れるか...どちらもとても良いです!

4

2 に答える 2

8

1.0 はデフォルトで double です。正しい値が 1.2 の場合、暗黙的なキャストが行われ、値は double から float にキャストされます (キャストはランタイム操作ではありません)。この場合、1.2f と呼ぶことは重要ではありません。プログラマーはたいていそれを悪用しますが、それが本当に重要な場合もあります。

例えば:

float var= 1.0e-45;
NSLog(@"%d",var==1.0e-45);

1.0e-45 は小さすぎて単精度浮動小数点変数に格納できないため、これはゼロを出力し、ゼロに等しくなります。var==1.0e-45f と書くと結果が変わります。

フォーマット指定子を使用することは、式を記述するときに最も重要です。左の値は浮動小数点数であるため、式も浮動小数点数として扱われると予想されますが、そうはなりません。

より印象的なケースは、l フォーマット指定子を数値に使用してゼロになるまで大幅にシフトした場合で、その結果に驚かされます。

long var= 1<<32;  // I assume that an int takes 4 bytes and a long 8 bytes

結果はゼロで、1l<<32 を書き込むと結果が完全に変わります。

于 2013-03-22T23:54:44.017 に答える
7

あなたのスニペットでは、ただの代入です。「f」サフィックスは必要ありません。実際、使用しないでください。CGFloat が単精度の場合 (iOS のように)、値は「f」の有無にかかわらず単精度で格納され、CGFloat が倍精度の場合 (Mac OS のように)、単精度の値を不必要に作成することになります。格納された倍精度。

一方、算術演算を行う場合は、'f' を適切に使用するか使用しないかに注意する必要があります。単精度で作業していて、「f」なしで「1.2」のようなリテラルを含めると、コンパイラは他のオペランドを倍精度に昇格させます。また、倍精度で作業していて「f」を含める場合 (Mac OS での割り当てと同様)、単精度の値を作成して、すぐに double に変換することになります。

于 2013-03-22T23:55:33.593 に答える