Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör az F#-ban elérhető aritmetikai operátorokat ismerteti.
Bináris aritmetikai operátorok összegzése
Az F# számtani műveletei két módban hajthatók végre: Nincs bejelölve és Bejelölve. Az aritmetikai műveletek alapértelmezés szerint nem ellenőrzött viselkedést használnak, amely rangsorolja a teljesítményt, de lehetővé teszi a túlcsordulást/alulcsordulást. Az ellenőrzött operátorok az ilyen esetekben kivételekkel rangsorolják a biztonságot.
Nem ellenőrzött számtani operátorok
Az alábbi táblázat összefoglalja azokat a bináris aritmetikai operátorokat, amelyek nem bejelölt integrál- és lebegőpontos típusokkal érhetők el a nem ellenőrzött aritmetika esetében.
| Bináris operátor | Jegyzetek |
|---|---|
+ (kiegészítés, plusz) |
Nincs ellenőrizve. Lehetséges túlcsordulási feltétel, ha a számok össze vannak adva, és az összeg meghaladja a típus által támogatott maximális abszolút értéket. |
- (kivonás, mínusz) |
Nincs ellenőrizve. Lehetséges alulcsordulási feltétel az aláíratlan típusok kivonásakor, vagy ha a lebegőpontos értékek túl kicsik ahhoz, hogy a típus képviselje. |
* (szorzás, idő) |
Nincs ellenőrizve. Lehetséges túlcsordulási feltétel, ha a számokat megszorozzák, és a termék meghaladja a típus által támogatott maximális abszolút értéket. |
/ (osztás, osztva) |
A nullával való osztás az integráltípusokhoz vezet DivideByZeroException . Lebegőpontos típusok esetén a nullával való osztás speciális lebegőpontos értékeket infinity vagy -infinity. Lehetséges alulcsordulási feltétel is, ha egy lebegőpontos szám túl kicsi ahhoz, hogy a típus képviselje. |
% (maradék, rem) |
Egy osztási művelet fennmaradó részét adja vissza. Az eredmény jele megegyezik az első operandus jelével. |
** (exponenciális, a hatalom) |
Lehetséges túlcsordulási feltétel, ha az eredmény meghaladja a típus maximális abszolút értékét. Az exponenciális operátor csak lebegőpontos típusokkal működik. |
A nem ellenőrzött viselkedés nem ad kivételeket túlcsordulás vagy alulcsordulás esetén, így kevésbé biztonságos a nagy vagy peremhálózati értékek számtani adatai számára.
Ellenőrzött számtani operátorok
Az alábbi táblázat összefoglalja azokat a bináris aritmetikai operátorokat, amelyek a bejelölt aritmetika esetében érhetők el, nem beérkezett integráltípusokkal. Az ellenőrzött operátorok biztosítják a túlcsordulás vagy az alulcsordulás számításainak ellenőrzését, így biztonságosabb aritmetika a kritikus alkalmazásokhoz.
| Bináris operátor | Jegyzetek |
|---|---|
+ (kiegészítés, plusz) |
Olyan eredményt ad OverflowException , amely meghaladja a maximális értéket, vagy a típus által támogatott minimális érték alatt van. A túlcsordulás és az alulcsordulás is lehetséges. |
- (kivonás, mínusz) |
Olyan eredményt ad OverflowException , amely meghaladja a maximális értéket, vagy a típus által támogatott minimális érték alatt van. A túlcsordulás és az alulcsordulás is lehetséges. |
* (szorzás, idő) |
OverflowException Ha a termék túllépi a maximális értéket, vagy a típus által támogatott minimális érték alá kerül. A túlcsordulás és az alulcsordulás is lehetséges. |
Az ellenőrzött operátorok hasznosak a számtani túlcsordulások elfogása és explicit kezelése érdekében.
Például:
open Microsoft.FSharp.Core.Operators.Checked
let safeAddition () =
try
let result = 2147483647 + 1 // Attempt to add integers at their maximum boundary
printfn "Result: %d" result
with
| :? System.OverflowException as ex ->
printfn "Overflow occurred: %s" ex.Message
safeAddition()
// Output:
// Overflow occurred: Arithmetic operation resulted in an overflow.
Választás a bejelölt és a nem ellenőrzött operátorok között
Bejelölt operátorok: Ideális olyan forgatókönyvekhez, ahol a túlcsordulási hibákat explicit módon kell észlelni és kezelni.
Nem bejelölt operátorok: Alapértelmezés szerint az F# a teljesítmény szempontjából nem ellenőrzött aritmetikai értéket használ. Ezek a műveletek túlcsordulás vagy alulcsordulás esetén csendesen helytelen eredményeket eredményezhetnek. Óvatosan használja.
Unary Aritmetic Operátorok összegzése
Az alábbi táblázat összefoglalja az integrál- és lebegőpontos típusok számára elérhető számtani operátorokat.
| Unary operátor | Jegyzetek |
|---|---|
+ (pozitív) |
Bármely aritmetikai kifejezésre alkalmazható. Nem módosítja az érték jelét. |
- (negation, negatív) |
Bármely aritmetikai kifejezésre alkalmazható. Módosítja az érték jelét. |
Az integráltípusok esetében a túlcsordulás vagy a túlcsordulás viselkedése körbefut. Ez helytelen eredményt eredményez. Az egész szám túlcsordulása potenciálisan súlyos probléma, amely hozzájárulhat a biztonsági problémákhoz, ha a szoftvereket nem kell figyelembe venni. Ha ez az alkalmazással kapcsolatos probléma, fontolja meg az ellenőrzött operátorok használatát a következőben Microsoft.FSharp.Core.Operators.Checked: .
Bináris összehasonlító operátorok összegzése
Az alábbi táblázat az integrált és lebegőpontos típusok esetében elérhető bináris összehasonlító operátorokat mutatja be. Ezek az operátorok típusértékeket boolad vissza.
A lebegőpontos számokat soha nem szabad közvetlenül hasonlítani az egyenlőséghez, mivel az IEEE lebegőpontos ábrázolása nem támogatja a pontos egyenlőségi műveletet. Előfordulhat, hogy két szám, amelyet a kód vizsgálatával egyszerűen ellenőrizheti, különböző bitábrázolásokkal rendelkezhet.
| Operátor | Jegyzetek |
|---|---|
= (egyenlőség, egyenlőség) |
Ez nem hozzárendelés-operátor. Csak összehasonlításra használható. Ez egy általános operátor. |
> (nagyobb, mint) |
Ez egy általános operátor. |
< (kisebb) |
Ez egy általános operátor. |
>= (nagyobb vagy egyenlő) |
Ez egy általános operátor. |
<= (kisebb vagy egyenlő) |
Ez egy általános operátor. |
<> (nem egyenlő) |
Ez egy általános operátor. |
Túlterhelt és általános operátorok
A jelen témakörben tárgyalt összes operátor a Microsoft.FSharp.Core.Operators névtérben van definiálva. Néhány operátor statikusan feloldott típusparaméterek használatával van definiálva. Ez azt jelenti, hogy minden egyes típushoz vannak egyedi definíciók, amelyek az adott operátorral működnek. Ebben a kategóriában az összes nem szereplő és bináris aritmetikai és bitenkénti operátor szerepel. Az összehasonlító operátorok általánosak, ezért bármilyen típussal működnek, nem csak primitív aritmetikai típusokkal. A diszkriminált egyesítési és rekordtípusok saját egyéni implementációkkal rendelkeznek, amelyeket az F#-fordító hoz létre. Az osztálytípusok a metódust Equalshasználják.
Az általános operátorok testreszabhatók. Az összehasonlító függvények testreszabásához felülbírálhatja Equals a saját egyéni egyenlőségi összehasonlítását, majd implementálhatja IComparable. Az System.IComparable interfész egyetlen metódussal rendelkezik, a metódussal CompareTo .
Operátorok és típuskövetkeztetés
Egy operátor kifejezésben való használata korlátozza az adott operátorra vonatkozó következtetést. Emellett az operátorok használata megakadályozza az automatikus általánosítást, mivel az operátorok használata számtani típust feltételez. Egyéb információ hiányában az F# fordító az aritmetikai kifejezések típusaként következtet int . Ezt a viselkedést felülbírálhatja egy másik típus megadásával. Így a következő kód argumentumtípusai és visszatérési function1 típusa a következő int, de a típusok function2 a következőkre következtetnek float.
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y
Lásd még
- Szimbólum és operátor referenciája
- Operátor túlterhelése
- bitenkénti operátorok
- Logikai operátorok