Operatori aritmetici (F#)
In questo argomento vengono descritti gli operatori aritmetici disponibili nel linguaggio F#.
Riepilogo degli operatori aritmetici binari
Nella tabella seguente vengono riepilogati gli operatori aritmetici binari disponibili per i tipi a virgola mobile e integrali sottoposti a unboxing.
Operatore binario |
Note |
---|---|
+ (somma, più) |
Deselezionato. Possibile condizione di overflow quando vengono sommati numeri e la somma supera il valore assoluto massimo supportato dal tipo. |
- (sottrazione, meno) |
Deselezionato. Possibile condizione di underflow quando vengono sottratti tipi senza segno o quando i valori a virgola mobile sono troppo piccoli per essere rappresentati dal tipo. |
* (moltiplicazione, per) |
Deselezionato. Possibile condizione di overflow quando vengono moltiplicati numeri e il prodotto supera il valore assoluto massimo supportato dal tipo. |
/ (divisione, diviso) |
La divisione per zero provoca un evento DivideByZeroException per i tipi integrali. Per i tipi a virgola mobile, la divisione per zero produce i valori a virgola mobile speciali +Infinity o -Infinity. Vi è una possibile condizione di underflow anche quando un numero a virgola mobile è troppo piccolo per essere rappresentato dal tipo. |
% (modulus, mod) |
Restituisce il resto di un'operazione di divisione. Il segno del risultato è analogo al segno del primo operando. |
** (elevamento a potenza, alla potenza di) |
Possibile condizione di overflow quando il risultato supera il valore assoluto massimo per il tipo. L'operatore di elevamento a potenza funziona solo con tipi a virgola mobile. |
Riepilogo degli operatori aritmetici unari
Nella tabella seguente vengono riepilogati gli operatori aritmetici unari disponibili per i tipi a virgola mobile e integrali.
Operatore unario |
Note |
---|---|
+ (positivo) |
Può essere applicato a qualsiasi espressione aritmetica. Non modifica il segno del valore. |
- (negazione, segno negativo) |
Può essere applicato a qualsiasi espressione aritmetica. Modifica il segno del valore. |
Il comportamento in caso di overflow o underflow per i tipi integrali prevede il wrapping. Questo comporta un risultato non corretto. L'overflow di tipi Integer rappresenta un problema potenzialmente grave che può comportare problemi di sicurezza quando il software non è scritto in modo da poterlo gestire. Se si ritiene che questo problema potrebbe verificarsi nella propria applicazione, utilizzare le forme verificate degli operatori in Microsoft.FSharp.Core.Operators.Checked.
Riepilogo degli operatori di confronto binari
Nella tabella seguente vengono illustrati gli operatori di confronto binari disponibili per i tipi a virgola mobile e integrali. Questi operatori restituiscono valori di tipo bool.
I numeri a virgola mobile non devono essere mai confrontati direttamente per verificarne l'uguaglianza, in quanto la rappresentazione a virgola mobile IEEE non supporta un'operazione di uguaglianza esatta. Due numeri di cui è possibile verificare facilmente l'uguaglianza controllando il codice potrebbero in realtà disporre di rappresentazioni in bit diverse.
Operatore |
Note |
---|---|
= (uguaglianza, uguale a) |
Non si tratta di un operatore di assegnazione. Viene utilizzato solo per il confronto. Si tratta di un operatore generico. |
> (maggiore di) |
Si tratta di un operatore generico. |
< (minore di) |
Si tratta di un operatore generico. |
>= (maggiore o uguale a) |
Si tratta di un operatore generico. |
<= (minore o uguale a) |
Si tratta di un operatore generico. |
<> (diverso da) |
Si tratta di un operatore generico. |
Operatori generici e di overload
Tutti gli operatori discussi in questo argomento sono definiti nello spazio dei nomi Microsoft.FSharp.Core.Operators. Alcuni degli operatori sono definiti tramite parametri di tipo risolti staticamente. Ciò significa che sono disponibili singole definizioni per ogni tipo specifico che funziona con tale operatore. Tutti gli operatori bit per bit e aritmetici, binari e unari sono inclusi in questa categoria. Gli operatori di confronto sono generici e pertanto funzionano con qualsiasi tipo, non solo con i tipi aritmetici primitivi. Le unioni discriminate e i tipi di record dispongono di implementazioni personalizzate generate dal compilatore F#. I tipi di classe utilizzano il metodo Equals.
Gli operatori generici possono essere personalizzati. Per personalizzare le funzioni di confronto, eseguire l'override di Equals per fornire confronto di uguaglianza personalizzato, quindi implementare IComparable. L'interfaccia IComparable dispone solo del metodo CompareTo.
Operatori e inferenza del tipo
L'utilizzo di un operatore in un'espressione vincola l'inferenza del tipo a tale operatore. L'utilizzo di operatori impedisce inoltre la generalizzazione automatica, in quanto implica un tipo aritmetico. In assenza di qualsiasi altra informazione, il compilatore F# deriva int come tipo delle espressioni aritmetiche. È possibile eseguire l'override di questo comportamento specificando un tipo diverso. I tipi di argomento e il tipo restituito di function1 nel codice seguente sono pertanto derivati come int, mentre i tipi per function2 vengono derivati come 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