| 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á 010/3 dá 3i%j é o resto da divisão inteira de i por j:
10%3 dá 112%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 ii+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: 2Cuidado: 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 2i++ 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 0Pode 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: 4i = 1;
j = 2;
k = i++ + j++;
// i: 2, j: 3, k: 3Recomendaçã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 é 6a = 1 o resultado é 2Logo: 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.