Buscar

Como se pode notar, esse tipo de operador é muito útil quando a variável que vai receber o resultado da expressão é também um dos operandos d...

Como se pode notar, esse tipo de operador é muito útil quando a variável que vai receber o resultado da expressão é também um dos operandos da expressão. Por exemplo, a expressão x = x + 10 * y; pode ser reescrita usando o operador simplificado como sendo x += 10 * y; 2.5.7 OPERADORES DE PRÉ E PÓS-INCREMENTO Além dos operadores simplificados, a linguagem C também possui operadores de pré e pós-incremento. Estes operadores podem ser utilizados sempre que for necessário necessário incrementar (somar uma unidade) ou decrementar (subtrair uma unidade) um determinado valor, como mostra a tabela abaixo: Operador Significado Exemplo ++ pré ou pós incremento ++x ou x++ - - pré ou pós decremento - -x ou x- - Tanto o operador de incremento (++) quanto o de decremento (- -) já possui embutida uma operação de atribuição. Note, no entanto, que esse operador pode ser usado antes ou depois do nome da variável, com uma diferença significativa: • ++x: incrementa a variável x antes de utilizar seu valor; • x++: incrementa a variável x depois de utilizar seu valor. Essa diferença de sintaxe no uso do operador não tem importância se o operador for usado sozinho, como mostra o exemplo abaixo: Exemplo de pós e pré incremento sozinho Pré incremento Pós incremento 1 #include 2 #include 3 i n t main ( ) { 4 i n t x = 10; 5 ++x ; 6 p r i n t f ( ‘ ‘ x = %d
’ ’ , x ) ; 7 system ( ‘ ‘ pause ’ ’ ) ; 8 return 0; 9 } 1 #include 2 #include 3 i n t main ( ) { 4 i n t x = 10; 5 x++; 6 p r i n t f ( ‘ ‘ x = %d
’ ’ , x ) ; 7 system ( ‘ ‘ pause ’ ’ ) ; 8 return 0; 9 } Saı́da x = 11 x = 11 Porém, se esse operador for utilizado dentro de uma expressão aritmética, como no exemplo abaixo, a diferença é entre os dois operadores é evi- dente: Exemplo de pós e pré incremento numa expressão Pré incremento Pós incremento 1 #include 2 #include 3 i n t main ( ) { 4 i n t y , x = 10; 5 / / incrementa , depois a t r i b u i 6 y = ++x ; 7 p r i n t f ( ‘ ‘ x = %d
’ ’ , x ) ; 8 p r i n t f ( ‘ ‘ y = %d
’ ’ , y ) ; 9 system ( ‘ ‘ pause ’ ’ ) ; 10 return 0; 11 } 1 #include 2 #include 3 i n t main ( ) { 4 i n t y , x = 10; 5 / / a t r i b u i , depois incrementa 6 y = x++; 7 p r i n t f ( ‘ ‘ x = %d
’ ’ , x ) ; 8 p r i n t f ( ‘ ‘ y = %d
’ ’ , y ) ; 9 system ( ‘ ‘ pause ’ ’ ) ; 10 return 0; 11 } Saı́da x = 11 x = 11 y = 11 y = 10 Como se pode ver, no primeiro exemplo o operador de pré-incremento (++x) é a primeira coisa a ser realizada dentro da expressão. Somente depois de incrementado o valor de x é que o mesmo é atribuı́do a variável y. Nota-se, nesse caso, que a expressão y = ++x; é equivalente a fazer x = x + 1; y = x; Já no segundo exemplo, o operador de pós-incremento (x++) é a última coisa a ser realizada dentro da expressão. Primeiro atribui-se o o valor de x para a variável y para somente depois incrementar a variável x. Nota-se, nesse caso, que a expressão y = x++; é equivalente a fazer y = x; x = x + 1; 2.5.8 MODELADORES DE TIPOS (CASTS) Modeladores de tipos (também chamados de type cast) são uma forma explı́cita de conversão de tipo, onde o tipo a ser convertido é explicitamente definido dentro de um programa. Isso é diferente da conversão implicita, que ocorre naturalmente quando tentamos atribuir um número real para uma variável inteira. Em linguagem C, o uso de um modelador de tipo segue a seguinte forma geral: (nome do tipo) expressão Um modelador de tipo é definido pelo próprio nome do tipo entre parêntese. Ele é colocado a frente de uma expressão e tem como objetivo forçar o re- sultado da expressão a ser de um tipo especificado, como mostra o exem- plo abaixo: Exemplos de modeladores de tipo 1 #include 2 #include 3 i n t main ( ) { 4 f l o a t x , y , f = 65 .5 ; 5 x = f / 1 0 . 0 ; 6 y = ( i n t ) ( f / 1 0 . 0 ) ; 7 p r i n t f ( ‘ ‘ x = %f
’ ’ , x ) ; 8 p r i n t f ( ‘ ‘ y = %f
’ ’ , y ) ; 9 system ( ‘ ‘ pause ’ ’ ) ; 10 return 0; 11 } Saı́da x = 6.550000 y = 6.000000 No exemplo acima, tanto os valores de x quanto de y são obtidos utilizando a mesma expressão. Porém, no caso da variável y (linha 6), o resultado da expressão é convertido para o tipo inteiro (int), o que faz com que seu resultado perca as casas decimais. 2.5.9 OPERADOR VÍRGULA “,” Na linguagem C, o operador vı́rgula “,” pode ser utilizado de duas maneiras: • Como pontuação. Por exemplo, para separar argumentos de uma função: int minha funcao(int a, float b) • Determinar uma lista de expressões que devem ser executadas se- quencialmente. x = (y = 2, y + 3); Nesse caso, as expressões são executadas da esquerda para a di- reita: o valor 2 é atribuı́do a y, o valor 3 é somado a y e o total (5) será atribuı́do à variável x. Pode-se encadear quantos operadores “,” forem necessários. Na linguagem C, o operador “,” é um separador de coman- dos, enquanto o operador “;” é um terminador de coman- dos. 2.5.10 PRECEDÊNCIA DE OPERADORES Como podemos ver, a linguagem C contém muitos operadores. Conse- quentemente, o uso de múltiplos operadores em uma única expressão pode tornar confusa a sua interpretação. Por esse motivo, a linguagem C possui uma série de regras de precedência de operadores. Isso per- mite que o compilador possa decidir corretamente qual a ordem em que os operadores deverão ser executado em uma expressão contendo vários operadores. As regras de precedência seguem basicamente as regras da matemática, onde a multiplicação e a divisão são executadas antes da soma e da subtração. Além disso, pode-se utilizar de parênteses para forçar o compilador a executar uma parte da expressão antes das demais. A tabela abaixo mostra as regras de precedência dos operadores presen- tes na linguagem C. Quanto mais alto na tabela, maior o nı́vel de pre- cedência (prioridade) dos operadores em questão. Na primeira linha da tablea são apresentados os operadores executados em primeiro lugar, en- quanto a última linha apresenta os operadores executados por último em uma expressão: MAIOR PRECEDÊNCIA ++ – Pré incremento/decremento () Parênteses (chamada de função) [ ] Elemento de array . Elemento de struct -¿ Conteúdo de elemento de ponteiro para struct ++ – Pós incremento/decremento + - Adição e subtração unária ! ∼ Não