Dela via


Aritmetiska operatorer

Det här avsnittet beskriver aritmetiska operatorer som är tillgängliga i F#.

Sammanfattning av binära aritmetiska operatorer

I följande tabell sammanfattas de binära aritmetiska operatorer som är tillgängliga för oboxade integral- och flyttalstyper.

Binär operator Kommentar
+ (tillägg, plus) Avmarkerad. Möjligt spillvillkor när tal läggs ihop och summan överskrider det högsta absoluta värde som stöds av typen.
- (subtraktion, minus) Avmarkerad. Möjliga underflödesvillkor när osignerade typer subtraheras, eller när flyttalsvärdena är för små för att representeras av typen.
* (multiplikation, tider) Avmarkerad. Möjligt spillvillkor när tal multipliceras och produkten överskrider det högsta absoluta värde som stöds av typen.
/ (division, dividerat med) Division med noll orsakar en DivideByZeroException för integraltyper. För flyttalstyper ger division med noll de särskilda flyttalsvärdena infinity eller -infinity. Det finns också ett möjligt underflödesvillkor när ett flyttalsnummer är för litet för att representeras av typen .
% (rest, rem) Returnerar resten av en divisionsåtgärd. Resultatets tecken är samma som tecknet för den första operanden.
** (exponentiation, till driva av) Möjligt spillvillkor när resultatet överskrider det maximala absoluta värdet för typen.

Exponentiationsoperatorn fungerar endast med flyttalstyper.

Sammanfattning av icke-aritmetiska operatorer

I följande tabell sammanfattas de oarliga aritmetiska operatorer som är tillgängliga för integral- och flyttalstyper.

Unary-operator Kommentar
+ (positivt) Kan tillämpas på alla aritmetiska uttryck. Ändrar inte värdets tecken.
- (negation, negativ) Kan tillämpas på alla aritmetiska uttryck. Ändrar värdets tecken.

Beteendet vid spill eller underflöde för integraltyper är att omsluta. Detta orsakar ett felaktigt resultat. Heltalsspill är ett potentiellt allvarligt problem som kan bidra till säkerhetsproblem när programvara inte skrivs för att ta hänsyn till det. Om det här är ett problem för ditt program kan du överväga att använda de kontrollerade operatorerna i Microsoft.FSharp.Core.Operators.Checked.

Sammanfattning av binära jämförelseoperatorer

I följande tabell visas de binära jämförelseoperatorer som är tillgängliga för integral- och flyttalstyper. Dessa operatorer returnerar värden av typen bool.

Flyttalsnummer bör aldrig jämföras direkt för likhet, eftersom IEEE-flyttalsrepresentationen inte stöder en exakt likhetsåtgärd. Två tal som du enkelt kan verifiera är lika med genom att kontrollera att koden faktiskt kan ha olika bitrepresentationer.

Operator Kommentar
= (likhet, lika med) Det här är inte en tilldelningsoperator. Det används endast för jämförelse. Det här är en allmän operator.
> (större än) Det här är en allmän operator.
< (mindre än) Det här är en allmän operator.
>= (större än eller lika med) Det här är en allmän operator.
<= (mindre än eller lika med) Det här är en allmän operator.
<> (inte lika med) Det här är en allmän operator.

Överlagrade och generiska operatorer

Alla operatorer som beskrivs i det här avsnittet definieras i namnområdet Microsoft.FSharp.Core.Operators . Vissa av operatorerna definieras med statiskt lösta typparametrar. Det innebär att det finns enskilda definitioner för varje specifik typ som fungerar med operatorn. Alla unary- och binära aritmetiska operatorer och bitvis-operatorer finns i den här kategorin. Jämförelseoperatorerna är generiska och fungerar därför med alla typer, inte bara primitiva aritmetiska typer. Diskriminerade unions- och posttyper har egna anpassade implementeringar som genereras av F#-kompilatorn. Klasstyper använder metoden Equals.

De allmänna operatorerna är anpassningsbara. Om du vill anpassa jämförelsefunktionerna åsidosätter du Equals för att tillhandahålla en egen anpassad likhetsjämförelse och implementerar IComparablesedan . Gränssnittet System.IComparable har en enda metod, CompareTo metoden.

Operatorer och typinferens

Användningen av en operator i ett uttryck begränsar typinferens för operatorn. Dessutom förhindrar användningen av operatorer automatisk generalisering, eftersom användningen av operatorer innebär en aritmetiktyp. I avsaknad av annan information härleder int F#-kompilatorn som typ av aritmetiska uttryck. Du kan åsidosätta det här beteendet genom att ange en annan typ. Argumenttyperna och returtypen function1 i följande kod härleds därför till int, men typerna för function2 härleds floattill .

// 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

Se även