2017-08-03 5 views
1
多くの言語で

と同様に、スウィフトの除算演算子のデフォルトは除算を整数へ、そう:浮動小数点除算のための迅速な変換はなぜ機能しますか?

let n = 1/2 
print(n) // 0 

あなたは浮動小数点除算をしたい場合は、あなたが他のほとんどの言語と同様に、ここでも

let n1 = 1.0/2 
let n2 = 1/2.0 
let n3 = Double(1)/2 
let n4 = 1/Double(2) 

print(n1) // 0.5 
print(n2) // 0.5 
print(n3) // 0.5 
print(n4) // 0.5 

をしなければならない、あなた全体の動作をキャストすることはできません:迅速1及び2の整数除算を実行するため起こる

let n5 = Double(1/2) 
print(n5) // 0.0 

1/2)、0を取得してからDoubleにキャストしようとすると、効果的に0.0が返されます。

私は次の作品を理由として興味津々:

let n6 = (1/2) as Double 
print(n6) // 0.5 

私はこのように感じるがDouble(1/2)と同じ結果を生成しなければなりません。それはなぜですか?

+0

'Double(1/2)'は*キャストされません。 'Int'から' Double'への変換*です。 '(1/2)as Double'のような変換は行われません。整数リテラルは単純にdoubleと推定されます。 'https://stackoverflow.com/q/28813516/2976878 – Hamish

+2

[ストレンジ・スウィフト番号の型キャスト](https://stackoverflow.com/questions/28813516/strange-swift-numbers-type-casting)の可能性のある重複 –

答えて

4

12はリテラルです。文脈からタイプを与えない限り、タイプはありません。

let n6 = (1/2) as Double 

あなたは結果がDoubleあるコンパイラに伝える、つまり本質的

let n6: Double = 1/2 

と同じです。それはDouble結果にオペレータ/のコンパイラ検索を意味し、それはそれは2つのDoubleオペランドに対してオペレータ/を見つけるため、タイプDoubleの両方としてリテラルを考慮することを意味します。

一方、

let n5 = Double(1/2) 

キャスト(またはそれ前記、Doubleの初期化)です。つまり、式1/2が最初に評価されてからDoubleに変換されます。

+2

の比較Double(1/2) 'はキャストではありません。 (!?/)鋳造は、 ''などで行われ、私が知っている) – Hamish

+0

@Hamishが、構文は、私があまりにも多くのことを心配するわけではない、いくつかの言語での静的キャストに近いです:) – Sulthan

+0

'1と2がリテラルです。コンテキストから型を指定しない限り、型はありません。型が指定されていない場合、すべての整数リテラルのデフォルトは 'Int'です。 – JAL

関連する問題