Capítulo III – Declarações e Comandos de Atribuição 3.1 – Identificadores e palavras reservadas 3.2 – Elementos de comandos de atribuição 3.3 – Constantes 3.4 – Variáveis e suas declarações 3.5 – Declaração de tipos 3.6 – Operadores de expressões 3.7 – Funções e macros da biblioteca de C 3.8 – Expressões e atribuições especiais de C 3.6 – Operadores de expressões 3.6.1 – Precedência e associatividade de operadores Na expressão aritmética 12 + 3 * 10 primeiro realiza-se a multiplicação, depois a soma O resultado é 42 Diz-se que o operador ‘*’ tem precedência sobre o operador ‘+’ Se a precedência fosse do operador ‘+’, o resultado seria 150 Na expressão aritmética 10 - 3 - 2 primeiro realiza-se a subtração 10 - 3 = 7 e depois a subtração 7-2=5 Diz-se que o operador ‘-’ tem associatividade à esquerda Caso fosse realizada primeiro a subtração 3-2=1 e depois 10 - 1 = 9 dir-se-ia que essa associatividade era à direita Tabela de precedência e associatividade dos operadores da linguagem C Obs.: a precedência decresce de cima para baixo Exemplo: ordem de execução dos operadores de uma expressão Exercício 3.6.1: 1. Seja a expressão x = 3.4*(4.2+6.1) > 20-(8 * 3) && log(pow(10,3)) > exp(5-3); Mostrar seu esquema de execução, tal como no slide anterior, deixando claro seu resultado 3.6.2 – Operandos e resultados de operações aritméticas Os operadores +, -, * e / admitem operandos inteiros, reais e caracteres O resultado dessas operações depende dos tipos de seus operandos: Se pelo menos um for real, o resultado é real Em caso contrario é inteiro Na divisão, se os dois operandos forem inteiros ou caracteres, a parte fracionária é eliminada Exemplo: Operador %: resto da divisão do primeiro pelo segundo operando: 7/3=2 Não admite operandos reais O resultado é inteiro Exemplo: 7%3=1 Operador sizeof: seja o programa Tamanhos de tipos i+j: 4 bytes char: de1 bytes bytes sizeof: fornece o número de seu operando, queint: pode 4serbytes short: 2 bytes uma expressão ou um tipo de long: 4 bytes float: 4 bytes variável, entre parêntesis double: 8 bytes #include <stdio.h> #include <stdlib.h> int main () { short i; int j; printf ("Tamanhos de tipos\n\n"); Pressione ........ printf (" i+j:%3d bytes\n", sizeof (i+j)); Resultado printf (" char:%3d bytes\n", sizeof(char)); printf (" int:%3d bytes\n", sizeof(int)); printf (" short:%3d bytes\n", sizeof(short)); printf (" long:%3d bytes\n", sizeof(long)); printf (" float:%3d bytes\n", sizeof(float)); printf (" double:%3d bytes\n", sizeof(double)); printf ("\n\n"); system ("pause"); return 0; } 3.6.3 – Operandos e resultados de operações relacionais e lógicas Na Linguagem C, os operandos das operações relacionais e lógicas podem ser inteiros, reais ou caracteres Seu resultado é 1 ou 0, simulando respectivamente True ou False. Em operações lógicas, todo operando diferente de 0 (zero) é convertido para 1, seja ele inteiro, real ou caractere Exemplo: operações lógicas com inteiros e reais: 452 || 0 = 1 3.6 && 2.0 = 1 17502 && 0.0 = 0 ! 5.7 = 0 Tabela verdade dos operadores lógicos em C: 3.6.4 – Conversão de tipos Muitas vezes é desejável mudar o tipo do resultado de uma expressão Por exemplo, a divisão de dois inteiros resulta num inteiro Mas pode ser desejável obter a parte fracionária do resultado Exemplo: Programa #include <stdio.h> #include <stdlib.h> int main () { float x, y, z; x = 20 / 7; y = (float)20 / 7; z = (int)(2.5 * 4.3); printf ("x = %g; y = %g; z = %g", x, y, z); printf ("\n\n"); system ("pause"); return 0; } x = 2; y = 2.85714; z = 10 O valor de 20/7 é 2 (inteiro) Outras importantes conversões de tipos serão (float)20 converte 20 para apresentadas em capítulos real posteriores Então o valor de (float)20/7 é 2.85714 (real) O valor de (2.5 * 4.3) é 10.75 (real) (int) (2.5 * 4.3) converte o resultado de (2.5 * 4.3) para inteiro Digite algo: Resultado Então o valor de (int) (2.5 * 4.3) é 10 (inteiro) Capítulo III – Declarações e Comandos de Atribuição 3.1 – Identificadores e palavras reservadas 3.2 – Elementos de comandos de atribuição 3.3 – Constantes 3.4 – Variáveis e suas declarações 3.5 – Declaração de tipos 3.6 – Operadores de expressões 3.7 – Funções e macros da biblioteca de C 3.8 – Expressões e atribuições especiais de C 3.7 – Funções e macros da biblioteca de C A biblioteca de funções da Linguagem C é dividida em inúmeros arquivos, dentre eles: stdio.h: funções básicas de entrada e saída math.h: funções matemáticas conio.h: funções para controle do teclado e vídeo ctype.h: macros para testes de caracteres string.h: funções para manipulação de cadeias de caracteres E muitos outros ... (Ver o help dos ambientes) 3.7.1 – Funções matemáticas do math.h ceil(x) e floor(x): teto e piso de x Calculam valores inteiros mas o resultado é double Exemplo: ceil(y) = 37281715684.000000; floor(y) = 37281715683.000000; #include <stdio.h> Pressione . . . #include <math.h> Resultado #include <stdlib.h> int main () { double y = 37281715683.51; printf ("ceil(y) = %f;\nfloor(y) = %f;", ceil(y), floor(y)); printf ("\n\n "); system ("pause"); return 0; } Exercício 3.7.1: 1. Escrever em C as seguintes atribuições: 3.7.2 – Macros para testes de caracteres do ctype.h O resultado de cada macro é ≠0 (equivalente a 1, em operações lógicas) ou 0 (zero) Em vez de escrever if (isalpha(c) == 1) ....., deve-se escrever if (isalpha(c)) ..... uma frase encerrada por enter: Exemplo: escritaDigite das letras maiúsculas digitadas abcd +-*& EFGH 123456 #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> EFGHIJKLMN #include <stdlib.h> Digite algo para encerrar: void main () { char c; printf ("Digite uma frase encerrada por enter:\n\n\t"); scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } %faIJxyzKLMN!@#$ Resultado Buffer do teclado: Em algumas operações de leitura, o computador para, esperando o operador digitar zero ou mais caracteres encerrados por <enter> Nessas operações, enquanto o <enter> não for digitado, o computador não continua Não é o caso da execução das funções getch e getche (a serem vistas mais adiante) Buffer do teclado: Os caracteres digitados encerrados pelo <enter> são depositados numa região da RAM denominada buffer do teclado O <enter> também é depositado (no final) Em C, o buffer do teclado é referenciado por stdin Buffer do teclado: A função scanf retira desse buffer os caracteres para sua leitura Se o buffer estiver vazio, o computador espera a digitação Caso contrário, caracteres são retirados do buffer, sem a necessidade de o computador parar O programa anterior usa a função scanf _ Seja a execução deste programa #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; printf ("Digite uma frase encerrada por enter:\n\n\t"); scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } Vídeo c ? Buffer do teclado Digite uma frase encerrada por enter: _ #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; printf ("Digite uma frase encerrada por enter:\n\n\t"); scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } Vídeo c ? Buffer do teclado Digite uma frase encerrada por enter: _ #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ? scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } O buffer do teclado está vazio printf ("\n\n"); system ("pause"); return 0; Espera-se a digitação de algo } encerrado por <enter> Digite uma frase encerrada por enter: _ #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ? scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; O operador digita: } abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> Digite uma frase encerrada por enter: abcd _ +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ? scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; O operador digita: } abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> Digite uma frase encerrada por enter: abcd _ +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ? scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } scanf retira o primeiro caractere printf ("\n\n"); system ("pause"); do buffer e o coloca em c return 0; } Digite uma frase encerrada por enter: abcd _ +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘a’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { bcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } scanf retira o primeiro caractere printf ("\n\n"); system ("pause"); do buffer e o coloca em c return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘a’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { bcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘a’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { bcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Conteúdo de c não é } caractere de controle printf ("\n\n"); system ("pause"); !iscntrl(c) é Verdade return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘a’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { bcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Conteúdo de c não é letra } maiúscula printf ("\n\n"); system ("pause"); isupper(c) é Falso return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘a’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { bcd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } scanf retira o primeiro caractere printf ("\n\n"); system ("pause"); do buffer e o coloca em c return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘b’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { cd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } scanf retira o primeiro caractere printf ("\n\n"); system ("pause"); do buffer e o coloca em c return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘b’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { cd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘b’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { cd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Conteúdo de c não é letra } maiúscula printf ("\n\n"); system ("pause"); isupper(c) é Falso return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘b’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { cd +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } scanf retira o primeiro caractere printf ("\n\n"); system ("pause"); do buffer e o coloca em c return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘c’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { d +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } scanf retira o primeiro caractere printf ("\n\n"); system ("pause"); do buffer e o coloca em c return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘c’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { d +-*& EFGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } Tudo se repete até que o caractere printf ("\n\n"); system ("pause"); ‘E’ seja colocado em c return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> _ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘E’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { FGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Conteúdo de c é letra } maiúscula printf ("\n\n"); system ("pause"); isupper(c) é Verdade return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> E_ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘E’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { FGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> E_ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘E’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { FGH 123456 %faIJxyzKLMN!@#$<enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Assim os caracteres do buffer são lidos } printf ("\n\n"); system ("pause"); As letras maiúsculas são escritas return 0; Tudo termina no <enter> } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> EFGHIJKLMN_ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c ‘E’ scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { <enter> if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Assim os caracteres do buffer são lidos } printf ("\n\n"); system ("pause"); As letras maiúsculas são escritas return 0; Tudo termina no <enter> } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> EFGHIJKLMN_ #include <stdlib.h> void main () { char c; printf ("Digite uma frase encerrada por enter:\n\n\t"); scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } %faIJxyzKLMN!@#$ Vídeo c <enter> Buffer do teclado Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> EFGHIJKLMN_ #include <stdlib.h> void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c <enter> scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); Conteúdo de c é caractere } de controle printf ("\n\n"); system ("pause"); !iscntrl(c) é Falso return 0; } Digite uma frase encerrada por enter: abcd +-*& EFGH 123456 %faIJxyzKLMN!@#$ #include <stdio.h> Letras maiusculas digitadas: #include <ctype.h> EFGHIJKLMN #include <stdlib.h> Pressione qualquer tecla para continuar. . . _ void main () { char c; Vídeo printf ("Digite uma frase encerrada por enter:\n\n\t"); c <enter> scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) Buffer do teclado printf ("%c", c); scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } #include <stdio.h> #include <ctype.h> #include <stdlib.h> void main () { char c; printf ("Digite uma frase encerrada por enter:\n\n\t"); scanf ("%c", &c); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) printf ("%c", c); Fim da execução!!! scanf ("%c", &c); } printf ("\n\n"); system ("pause"); return 0; } Exercício 3.7.2: 1. Fazer um programa que, sem usar variáveis indexadas, solicite a digitação de uma frase encerrada por um <enter>, leia caractere por caractere dessa frase e escreva no vídeo todas as cadeias de caracteres não brancos da mesma, cada uma numa linha. Por exemplo, se a cadeia digitada for r12&) 23pgy; #$*8qtlx +jx6( <enter> o programa deve escrever no vídeo o seguinte: r12&) 23pgy; #$*8qtlx +jx6( Capítulo III – Declarações e Comandos de Atribuição 3.1 – Identificadores e palavras reservadas 3.2 – Elementos de comandos de atribuição 3.3 – Constantes 3.4 – Variáveis e suas declarações 3.5 – Declaração de tipos 3.6 – Operadores de expressões 3.7 – Funções e macros da biblioteca de C 3.8 – Expressões e atribuições especiais de C 3.8 – Expressões e atribuições especiais de C 3.8.1 – Operações de acréscimo e decréscimo unitário Variavel = Variavel + 1; pode ser substituído por Variavel ++; Variavel = Variavel – 1; pode ser substituído por Variavel --; ou ++ Variavel; ou -- Variavel; Variavel pode ser inteira, real ou caractere Outras propriedades dos operadores ++ e --: Variavel ++, ++ Variavel, Variavel -- e -- Variavel são expressões calculáveis (Variavel ++) é diferente de (++ Variavel) Depois de ambas expressões, o valor de Variavel recebe um acréscimo unitário O valor da expressão (Variavel ++) é o valor anterior de Variavel O valor da expressão (++ Variavel) é o novo valor de Variavel O operador -- tem propriedades análogas Exemplo: seja o programa: #include <stdio.h> #include <stdlib.h> Resultado: int main () { a = 0; b = -5; c = 1; d = 7; e = 2; y = 5; z = 4; int i = 0, a, b, c, d, e; float x = 5.0, y, z; Pressione . . . a = i; b = i++ - 5; c = i; d = ++i + 5; e = i; printf ("a = %d; b = %d; c = %d; d = %d; e = %d;", a, b, c, d, e); y = x--; printf ("\ny = %g;", y); z = --y; printf (" z = %g;", z); printf ("\n\n"); system ("pause"); return 0; } Exercício 3.8.1: 1. Sem utilizar ambiente de programação em C, dizer o que será escrito no vídeo com a execução do seguinte trecho de programa: int a, b = 0, c = 0; a = ++b + ++c; printf (“%d %d %d\n”, a, b, c); a = b++ + c++; printf (“%d %d %d\n”, a, b, c); a = ++b + c++; printf (“%d %d %d\n”, a, b, c); a = b-- + --c; printf (“%d %d %d\n”, a, b, c); 3.8.2 – Expressões contendo atribuições Em C, Variavel = Expressao (sem o ponto-e-vírgula ‘;’) é considerada uma expressão calculável Seu valor é o valor calculado de Expressao Pode ser usada como sub-expressão em expressões maiores Efeito colateral: Variavel recebe o valor de Expressao Exemplo: seja o programa: #include <stdio.h> #include <stdlib.h> int main () { int a, b, c; c = (a = 2) * (b = 3); printf ("a = %d; b = %d; c = %d;", a, b, c); printf ("\n\n"); system ("pause"); return 0;; } Resultado: a = 2; b = 3; c = 6; Pressione . . . Esta característica é usada para compactar várias atribuições numa só Exemplos: a = b + c; d = e – f; g = a * d + h; a = 1; b = 1; c = 1; g = (a = b + c) * (d = e – f) + h; a = b = c = 1; O operador ‘=’ tem associatividade à direita 3.8.3 – Outros operadores de atribuição Operadores: +=, -=, *=, /= e %= Significado: Expressão especial Variavel += Expressao Variavel -= Expressao Variavel *= Expressao Variavel /= Expressao Variavel %= Expressao Expressão equivalente Variavel = Variavel + Expressao Variavel = Variavel - Expressao Variavel = Variavel * Expressao Variavel = Variavel / Expressao Variavel = Variavel % Expressao Exemplo: seja o programa: #include <stdio.h> #include <stdlib.h> int main () { int a = 2, b = 3, c = 41; a += 5; b *= 3; c %= a + b; printf ("a = %d; b = %d; c = %d;", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Resultado: a = 7; b = 9; c = 9; Pressione . . . Exercício 3.8.3: 1. Sem utilizar ambiente de programação em C, dizer o que será escrito no vídeo com a execução do seguinte trecho de programa: int a = 1, b = 2, c = 3, d = 4, e, f, g; g = (a += ++d + (b *= (e = (f = d++ - --c)* ++b)) - --f) - ++d; printf ("a = %d; b = %d\nc = %d; d = %d\ne = %d; f = %d\ng = %d", a, b, c, d, e, f, g); 3.8.4 – Operador vírgula Em C, um conjunto de subexpressões separadas por vírgula é considerado uma expressão calculável As subexpressões são calculadas da esquerda para a direita e o valor da expressão total é o valor da última delas Exemplo: seja o programa: #include <stdio.h> #include <stdlib.h> int main () { int a, b, c, x; x = (a = 5, b = 3, c = a * b); printf ("a = %d; b = %d; c = %d; x = %d;", a, b, c, x); printf ("\n\n"); system ("pause"); return 0; } Resultado: a = 5; b = 3; c = 15; x = 15; Pressione . . .