adição | a+b |
subtração | a-b |
multiplicação | a*b |
divisão | a/b |
resto da divisão | a%b |
menos unário | -a |
mais unário | +a |
i = +1;
j = -i;
+
unário não tem qualquer efeito; é usado principalmente para sinalizar constantes positivas+
, *
, e /
permitem misturar operandos inteiros e vírgula-flutuanteint
e float
, o resultado é um float
2+0.5
dá 2.5
; 3.5/2
dá 1.75
/
é o quociente:
3/4
dá 0
10/3
dá 3
i%j
é o resto da divisão inteira de i
por j
:
10%3
dá 1
12%4
dá 0
/
e %
%
devem ser inteiros/
ou %
for 0, o resultado é indefinido (divisão por zero)%
for negativo:
i%j
tem o mesmo sinal que i
i+j*k
?
i
com o resultado de multiplicar j
por k
"i
com j
e multiplicar o resultado por k
"i+(j*k)
ou (i+j)*k
+
e -
unários*
, /
, %
+
e -
bináriosi + j * k |
equivalente a | i + (j*k) |
-i * -j |
equivalente a | (-i) * (-j) |
+ i + j/k |
equivalente a | (+i) + (j/k) |
+
, -
, *
, /
, %
) associam à esquerdai - j - k |
equivale a | (i - j) - k |
i * j / k |
equivale a | (i * j) / k |
- + j |
equivale a | -(+j) |
i = 5; /* valor de i: 5 */
j = i; /* valor de j: 5 */
k = 10 * i + j; /* valor de k: 55 */
Se a variável e expressão não forem do mesmo tipo dá-se uma conversão implícita de tipos.
int i;
float f;
i = 72.99; // valor de i: 72
f = 136; // valor de f: 136.0
Exemplo:
int i, j, k;
i = 1;
k = 1 + (j = i);
// j: 1, k: 2
Cuidado: usar atribuições no meio de expressões pode dificultar a compreensão de programas
Podemos atribuir um mesmo valor a várias variáveis:
i = j = k = 0;
Como a atribuição associa à direita, isto é equivalente a:
i = (j = (k = 0));
i = 12; // OK: i é um lvalue
12 = i; // erro: 12 não é um lvalue
1+j = 12; // erro: 1+j não é um lvalue
É frequente atribuir a uma variável um novo valor que depende do seu valor atual.
Exemplo:
i = i + 2;
Nestes casos podemos usar uma atribuição composta:
i += 2;
+=
\(e\)adicionar \(e\) de \(v\), guardando o resultado em \(v\)
-=
\(e\)subtrair \(e\) a \(v\), guardando o resultado em \(v\)
*=
\(e\)multiplicar \(e\) por \(v\), guardando o resultado em \(v\)
/=
\(e\)dividir \(v\) por \(e\), guardando o resultado em \(v\)
%=
\(e\)calcular o resto de divisão de \(v\) por \(e\), guardando o resultado em \(v\)
É frequente somar ou subtrair uma variável inteira de uma unidade.
i = i + 1;
j = j - 1;
Também aqui podemos usar uma atribuição composta:
i += 1;
j -= 1;
Em alternativa, podemos usar operadores de incremento ou decremento.
++i
ou --i
) ou pósfixa (i++
ou i--
)++i; // equivalente a i = i + 1
--j; // equivalente a j = j - 1
++i
modifica a variável i
(incrementa de uma unidade) e dá o valor resultante.
i = 1;
printf("%d\n", ++i); // imprime 2
printf("%d\n", i); // imprime 2
i++
dá o valor atual de i
e depois modifica a variável i
(incrementa de 1 unidade).
i = 1;
printf("%d\n", i++); // imprime 1
printf("%d\n", i); // imprime 2
++i
incrementa imediatamente, enquanto i++
incrementa mais tardei
será incrementada antes da próxima instruçãoO operador de decremento comporta-se de forma análoga ao de incremento:
i = 1;
printf("%d\n", --i); // imprime 0
printf("%d\n", i); // imprime 0
i = 1;
printf("%d\n", i--); // imprime 1
printf("%d\n", i); // imprime 0
Pode ser difícil seguir o efeito de múltiplos ++
ou --
em várias variáveis numa mesma expressão:
i = 1;
j = 2;
k = ++i + j++;
// i: 2, j: 3, k: 4
i = 1;
j = 2;
k = i++ + j++;
// i: 2, j: 3, k: 3
Recomendação: evite expressões com mútiplos incrementos.
a = 5;
c = (b = a + 2) - (a = 1);
Qual é o valor final de c
?
b = a + 2
o resultado é 6
a = 1
o resultado é 2
Logo: o comportamento deste programa depende da ordem de avaliação das subexpressões.
(a + b) * (c - d)
não sabemos se será calculado primeiro (a + b)
ou (c - d)
(b = a + 2) - (a = 1)
i = 2;
j = i * i++;
O resultado final de j
depende da ordem de avaliação da multiplicação (4
ou 6
).
c=(b=a+2)-(a=1);
ou j=i*i++;
têm comportamento indefinido:
-Wall
: gcc -Wall -o programa programa.c
Re-escrever o primeiro exemplo para evitar comportamento indefinido:
a = 5;
b = a + 2;
a = 1;
c = b - a;
Desta forma o resultado final de c
é sempre 6
.