P2 Flashcards
Expressões
Meios fundamentais de especificar computações em uma linguagem de programação
Determina o formato das expressões
Sintaxe
Determina a maneira como as expressões são avaliadas
Semântica
Fatores que definem a avaliação de uma expressão (4)
Ordem dos operadores (regras de precedência e associatividade)
Ordem dos operandos
Tipo dos operandos
Coerção
Duas ações realizadas pela execução de uma expressão
Avaliar os operandos
Executar a operação indicada
Expressões são compostas de _____________, ___________ e ____________.
Operandos
Operadores
Parênteses
Notação infixa
Operador entre os operandos
A + B
Notação pré-fixada e notação pós-fixada
Operador antes dos operandos
+ A B
Operador depois dos operandos
A++
Definem a ordem de avaliação quando diferentes operadores são encontrados em uma expressão
Regras de precedência
Na maioria das linguagens, os operadores booleanos têm a mesma precedência?
Sim
Regras que avaliam uma expressão quando todos os operadores têm a mesma precedência
Regras de associatividade
expressões são avaliadas da esquerda para a direita
Associatividade à esquerda
(binários - exceto atribuição)
expressões são avaliadas da direita para a esquerda
Associatividade à direita
(unários e atribuição)
operadores não podem ocorrer na sequência sem uso de parênteses para indicar a ordem
tipo de associatividade
não associativo
Ada: **(potência)
operadores relacionais
exprimem relação entre operandos
==, !=, >, <…
operadores que não podem ocorrer em sequência
operadores relacionais
incremento e decremento (lings baseadas em C)
(a++)++
5++ //erro: não pode incrementar uma constante literal
Operações associativas permitem aos compiladores…
… reordenas as operações para otimizar a validação da expressão.
Caso em que mesmo números inteiros podem não ser totalmente associativos
não é possível executar as operações em qualquer ordem
A + B + C + D
* Imagine que A e C são inteiros positivos absolutamente grandes e B e D sejam inteiros negativos absolutamente grandes:
* A + B não causa overflow, mas A + C pode causar.
* Para esses valores, essa expressão não é associativa porque não é possível executar as operações em qualquer ordem
A ordem de avaliação dos operandos é irrelevante se…
… nenhum operando tiver efeitos colaterais (função modificando variável externa)
A + func(A) //ordem de avaliação faz diferença
Um programa tem ________________ se quaisquer duas expressões nesse programa que têm o mesmo valor puderem ser substituídas uma pela outra em qualquer lugar sem afetar o resultado.
transparência referencial
(afetada pelos efeitos colaterais)
result1 = (func(a) + b) / (func(a) – b);
temp = func(a);
result2 = (temp + b) / (temp – b);
nesse exemplo, em que caso não há transparência referencial?
quando func(a) modifica o valor de b (efeito colateral)
Sobrecarga de operadores
Quando alguns operadores podem ser usados para mais de um propósito
ex: (+) adição e concatenação
“Uso múltiplo de um operador”
Vantagem e desvantagem da sobrecarga de operadores
Pode melhorar a legibilidade e facilidade de escrita (se usada com bom senso)
Pode comprometer seriamente a legibilidade e confiabilidade dos programas (se usada indiscriminadamente)
avaliação na qual o resultado é determinado sem avaliar todos os operandos e/ou operadores
avaliação curto-circuito
ex: x && y
se x é falso, não precisa avaliar o y pq o resultado final vai ser falso
Qual propriedade impede a ocorrência de erro de extrapolação de índice no exemplo abaixo?
while ( (i < matriz.length) && (matriz[i] != key) )
i++;
Avaliação curto-circuito
(a > b) || ((b++) / 3)
em que contexto um programa contendo o exemplo acima falharia?
Caso o programa dependa do incremento (b++) e o operador (||) aplica avalição curto-circuito
(b só será incrementado se (a > b) == False)
linguagens funcionais não possuem esta operação:
atribuição
base para linguagens imperativas e OO:
atribuição
- Presente em todas as linguagens imperativas e orientadas a objetos;
- Utiliza apenas uma variável do lado esquerdo.
Atribuição simples (a = 5;)
– Presente na linguagem Perl. Por exemplo:
($flag ? $count1 : $count2) = 0;
– É equivalente a:
if ($flag) { $count1 = 0; } else { $count2 = 0; }
Atribuição condicional
Realiza uma operação sobre uma variável e atribui o resultado a essa variável
Operador de atribuição composto (x+=5;)
– Operadores que são atribuições abreviadas
– Aparecem em versões pré-fixadas e pós-fixadas
Operadores de atribuição unários
z = x++; //pós-fixado equivalente a z = x; x = x + 1;
z = ++x; //pré-fixado equivalente a x = x + 1; z = x;
while ((ch = getChar()) != EOF) { … }
a = b = c = 0;
são exemplos de?
atribuição como expressão
Quando as atribuições como expressão podem resultar em erros indetectáveis?
Nas linguagens C e C++, pois as expressões condicionais são baseadas em números e não em booleanos
Ex: (x=y) ao invés de (x==y) // o compilador não acusa erro
a sentença de atribuição produz um resultado, que pode ser usado como operador em outras operações
Atribuição como expressão
Sentenças de atribuição de múltiplos alvos e fontes
Atribuições de lista
first, second, third = 20, 40, 60;
é exemplo de?
atribuição de lista
As ______________ são realizadas pela avaliação de expressões e atribuição dos valores resultantes a variáveis.
computações
Dois tipos de instruções de controle
Seleção e iteração
permitem selecionar entre caminhos alternativos do fluxo de execução do programa (tipo de instrução de controle)
seleção
provoca a execução repetida de um conjunto de sentenças (tipo de instrução de controle)
iteração
O que são sentenças de controle?
Sentenças com instruções de controle
O que é uma estrutura de controle
Sentença de controle + coleção de sentenças cuja execução ela controla
Instrução que realiza um salto para um local específico no programa identificado por um rótulo
Salto incondicional
ex: goto
Fornecem meios para escolher entre dois ou mais caminhos de execução em um programa
Sentenças de seleção
Quais são as duas categorias de sentenças de seleção?
Sentenças de seleção de dois caminhos
Sentenças de seleção múltipla
Em Sentenças de Seleção de Dois Caminhos, é especificada entre parênteses se nenhum marcador sintático for usado para introduzir a cláusula então
Expressão de controle
Usados para compor as sentenças compostas
em sentenças de seleção
Delimitadores de blocos (chaves ou palavras reservadas)
Em caso de seletores aninhados, na maioria das linguagens o else pertence a qual if?
ao if anterior mais próximo
Permitem a seleção de uma dentre qualquer número de grupo de sentenças
Sentenças de Seleção Múltiplas
Representa um desvio explícito em sentenças de seleção múltiplas
Sentença opcional break
Sentença opcional break
Representa um desvio explícito em sentenças de seleção múltiplas
Sentenças de Iteração fazem com que conjunto de ____________ seja executado zero ou mais vezes.
sentenças
Todas as linguagens de programação fornecem alguma forma de repetir segmentos de código?
Sim
Quais são as duas categorias de sentenças de iteração?
Sentenças de iteração lógicas
Sentenças de iteração com contador
Sentenças de iteração lógicas
O controle do laço é baseado em uma expressão booleana
O projeto de sentenças de iteração lógicas é mais simples que o de laços com contador?
Sim
laços com pré-teste e laços com pós-teste
while
do-while
Variável que armazena o valor da contagem em laços com contador
Variável de laço
Quais são os parâmetros dos laços com contador?
Valor inicial da variável do laço
Valor final da variável do laço
Tamanho do passo (o quanto os valores da variável do laço mudam a cada iteração)
O quanto os valores da variável do laço mudam a cada iteração
tamanho do passo