Operadores aritméticos
Este tópico descreve operadores aritméticos disponíveis em F#.
Resumo dos operadores aritméticos binários
A tabela a seguir resume os operadores aritméticos binários disponíveis para tipos integrais e de ponto flutuante não demarcados.
Operador binário | Observações |
---|---|
+ (adição, mais) |
Desmarcado. Possível condição de estouro quando os números são adicionados e a soma excede o valor absoluto máximo suportado pelo tipo. |
- (subtração, menos) |
Desmarcado. Possível condição de estouro negativo quando tipos não assinados são subtraídos ou quando os valores de ponto flutuante são muito pequenos para serem representados pelo tipo. |
* (multiplicação, vezes) |
Desmarcado. Possível condição de estouro quando os números são multiplicados e o produto excede o valor absoluto máximo suportado pelo tipo. |
/ (divisão, dividida por) |
A divisão por zero causa um DivideByZeroException para tipos integrais. Para tipos de ponto flutuante, a divisão por zero fornece os valores especiais de ponto flutuante infinity ou -infinity . Também há uma possível condição de estouro negativo quando um número de ponto flutuante é muito pequeno para ser representado pelo tipo. |
% (resto, res) |
Retorna o resto de uma operação de divisão. O sinal do resultado é do mesmo sinal do dividendo. |
** (exponenciação, elevado a) |
Possível condição de estouro quando o resultado excede o valor absoluto máximo para o tipo. O operador de exponenciação funciona apenas com tipos de ponto flutuante. |
Resumo dos operadores aritméticos unários
A tabela a seguir resume os operadores aritméticos unários disponíveis para tipos integrais e de ponto flutuante.
Operador unário | Observações |
---|---|
+ (positivo) |
Aplica-se a qualquer expressão aritmética. Não altera o sinal do valor. |
- (negação, negativo) |
Aplica-se a qualquer expressão aritmética. Altera o sinal do valor. |
O comportamento em estouro ou estouro negativo para tipos integrais é de encapsular. Isso causa um resultado incorreto. O estouro de inteiro é um problema potencialmente sério que pode contribuir para problemas de segurança quando o software não for escrito levando isso em conta. Se isso for uma preocupação para seu aplicativo, considere usar os operadores verificados em Microsoft.FSharp.Core.Operators.Checked
.
Resumo dos operadores de comparação binária
A tabela a seguir mostra os operadores de comparação binária disponíveis para tipos de ponto flutuante e integral. Esses operadores retornam valores do tipo bool
.
Os números de ponto flutuante nunca devem ser comparados diretamente quanto à igualdade, pois a representação de ponto flutuante do IEEE não dá suporte a uma operação de igualdade exata. Dois números que você pode verificar facilmente como iguais inspecionando o código podem na verdade ter representações de bits diferentes.
Operador | Observações |
---|---|
= (igualdade, igual a) |
Este não é um operador de atribuição. Ele é usado apenas para comparação. Este é um operador genérico. |
> (maior que) |
Este é um operador genérico. |
< (menor que) |
Este é um operador genérico. |
>= (maior ou igual a) |
Este é um operador genérico. |
<= (menor ou igual a) |
Este é um operador genérico. |
<> (diferente de) |
Este é um operador genérico. |
Operadores sobrecarregados e genéricos
Todos os operadores discutidos neste tópico são definidos no namespace Microsoft.FSharp.Core.Operators. Alguns dos operadores são definidos usando parâmetros de tipo estaticamente resolvidos. Isso significa que há definições individuais para cada tipo específico que funciona com esse operador. Todos os operadores aritméticos e bit a bit unários e binários estão nessa categoria. Os operadores de comparação são genéricos e, portanto, funcionam com qualquer tipo, não apenas tipos aritméticos primitivos. Os tipos de união e registro discriminados têm suas próprias implementações personalizadas geradas pelo compilador F#. Os tipos de classe usam o método Equals.
Os operadores genéricos são personalizáveis. Para personalizar as funções de comparação, substitua Equals para fornecer sua própria comparação de igualdade personalizada e implemente IComparable. A interface System.IComparable tem um único método, o método CompareTo.
Operadores e inferência de tipos
O uso de um operador em uma expressão restringe a inferência de tipo nesse operador. Além disso, o uso de operadores impede a generalização automática, pois o uso de operadores implica um tipo aritmético. Na ausência de qualquer outra informação, o compilador F# infere int
como o tipo de expressões aritméticas. Você pode substituir esse comportamento especificando outro tipo. Portanto, os tipos de argumento e o tipo de retorno do function1
no código a seguir são inferidos como int
, mas os tipos para function2
são inferidos como 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