Ybadoo - Soluções em Software Livre
Turmas
1º Semestre de 2026

Para compiladores e interpretadores, é essencial que a gramática livre de contexto utilizada para descrever a linguagem de programação não seja ambígua, pois, do contrário, não será possível determinar univocamente qual árvore de derivação deverá ser selecionada para uma dada sentença. Se uma gramática livre de contexto G é considerada ambígua, então:

A Todas as sentenças de L(G) possuem duas ou mais derivações mais à esquerda diferentes.

B Todas as sentenças de L(G) possuem duas ou mais derivações mais à direita diferentes.

C Todas as sentenças de L(G) possuem duas ou mais árvores de sintaxe diferentes.

D Existe pelo menos uma sentença pertencente à L(G) com duas ou mais derivações mais à direita diferentes.

E Todas as sentenças de L(G) possuem pelo menos uma derivação mais à direita.

Uma característica de projeto de expressões menos comumente discutida é a ordem de avaliação de operandos. As variáveis, nas expressões, são avaliadas buscando seus valores na memória. As constantes, às vezes, são avaliadas da mesma maneira. Em outros casos, uma constante pode fazer parte da instrução de linguagem de máquina e não exigir uma busca na memória. Se um operando for uma expressão colocada entre parênteses, todos os operandos que ela contém devem ser avaliados antes que seu valor possa ser usado como um operando. Se nenhum dos operandos de um operador tiver efeitos colaterais, a sua ordem de avaliação é irrelevante. Um efeito colateral de uma função, chamado efeito colateral funcional, ocorre quando ele modifica um de seus parâmetros ou uma variável global (declarada fora da função, mas acessível na função). Admitindo que a função fun, escrita na sintaxe da linguagem de programação C, seja definida como:

int fun(int *k)
{
*k += 4;
return 2 * (*k) + 1;
}

void main()
{
int a;
scanf("%d", &a);
int x = a + fun(&a) - (a / 2);
}

Considerando o programa apresentado, avalie as assertivas a seguir:

  1. O valor de x será 34, caso o valor de a seja 10 e os operandos sejam avaliados da esquerda para a direita.
  2. O valor de x será 38, caso o valor de a seja 10 e os operandos sejam avaliados da direita para a esquerda.
  3. O valor de x será 57, caso o valor de a seja 20 e os operandos sejam avaliados da esquerda para a direita.
  4. O valor de x será 61, caso o valor de a seja 20 e os operandos sejam avaliados da direita para a esquerda.

Quais das assertivas apresentadas estão corretas?

A apenas as assertivas I e II.

B apenas as assertivas I e III.

C apenas as assertivas II e III.

D apenas as assertivas II e IV.

E apenas as assertivas III e IV.

(Poscomp, 2024) Sobre os tipos de dados básicos, assinale a alternativa correta:

A As variáveis do tipo inteiro são utilizadas para armazenar valores que pertencem ao conjunto de números naturais (sem parte fracionária), positivos e negativos.

B O tipo caractere permite armazenar strings ou conjuntos de caracteres em uma variável do tipo caractere.

C Por padrão, uma variável do tipo inteiro admite somente valores positivos. Caso se deseje que a variável contenha valores negativos, é necessário utilizar o comando da linguagem de programação para incluir sinal.

D As variáveis do tipo vetor são utilizadas para armazenar valores numéricos com parte fracionária.

E O conjunto de operações disponível para o tipo caractere inclui soma, subtração, multiplicação, divisão inteira e resto da divisão.

Apresente a árvore de derivação (parse tree) da expressão aritmética x = a + b * c - d * a + b, sobre a gramática livre de contexto apresentada a seguir.

G = ({A, B, C, D, E, F, G}, {a, b, c, d, x, =, +, -, *, /, (, )}, P, A)
P = {A → G = B
B → D C | D
C → + D C | - D C | + D | - D
D → F E | F
E → * F E | / F E | * F | / F
F → ( B ) | G
G → a | b | c | d | x}

Com base nos conceitos sobre conversão de tipos, coerção e casts apresentados, analise as assertivas a seguir:

  1. Uma conversão particularizante ocorre quando um objeto é convertido para um tipo que não pode incluir todos os valores do tipo original, como exemplo, a conversão de double para int.
  2. A coerção é definida como uma conversão de tipo explícita, frequentemente chamada de cast, em que o programador deve obrigatoriamente indicar a conversão, como em (int) speed.
  3. Uma das desvantagens das coerções é que elas diminuem a habilidade do compilador na detecção de erros de tipagem, uma vez que as conversões são realizadas automaticamente.
  4. Conversões generalizantes são consideradas inseguras e ocorrem quando um objeto é convertido para um tipo que não inclui sequer aproximações para todos os valores do tipo original, como de double para float.

A análise permite concluir que:

A apenas as assertivas I e II.

B apenas as assertivas I e III.

C apenas as assertivas II e III.

D apenas as assertivas II e IV.

E apenas as assertivas III e IV.

Considere o seguinte programa escrito na sintaxe da linguagem de programação C:

int a, b;

void xpto (int x, int y)
{
int z = x + a;
x = y + 2;
y = y + z;
}

void main()
{
int a = 3;
int b = 2;
xpto(a, b);
printf("%d %d", a, b);
}

Considerando o programa apresentado, avalie as assertivas a seguir:

  1. Caso os parâmetros sejam passados por valor, os valores impressos serão 3 e 2.
  2. Caso os parâmetros sejam passados por valor, os valores impressos serão 4 e 2.
  3. Caso os parâmetros sejam passados por referência, os valores impressos serão 4 e 8.
  4. Caso os parâmetros sejam passados por referência, os valores impressos serão 3 e 8.

Quais das assertivas apresentadas estão corretas?

A apenas as assertivas I e II.

B apenas as assertivas I e III.

C apenas as assertivas II e III.

D apenas as assertivas II e IV.

E apenas as assertivas III e IV.

(Poscomp, 2024) Considerando os conceitos de verificação de tipos e inferência de tipos em linguagens de programação, assinale a alternativa correta.

A A verificação de tipos estática ocorre em tempo de execução e é comumente utilizada em linguagens de script como Python e JavaScript para identificar erros de tipo.

B A inferência de tipos é um recurso que exige que o programador declare explicitamente o tipo de cada variável e expressão, aumentando a verbosidade do código.

C Linguagens com verificação de tipos dinâmica não detectam erros de tipo até que a parte do código com o erro seja executada, o que pode levar a falhas em produção.

D A inferência de tipos geralmente compromete a segurança de tipos, pois o compilador (ou interpretador) pode fazer suposições incorretas sobre os tipos das variáveis.

E A verificação de tipos forte é sinônimo de verificação de tipos estática, garantindo que todos os erros de tipo sejam detectados antes da execução do programa.

A demora na adoção massiva da Programação Funcional é um dos casos mais interessantes da história da computação. Embora os fundamentos matemáticos (cálculo lambda) datem dos anos 1930 e a primeira linguagem funcional (Lisp) tenha surgido em 1958, a Programação Funcional só começou a ganhar tração significativa na indústria de software a partir dos anos 2000. Quais foram os principais fatores que inviabilizaram a adoção da Programação Funcional antes dos anos 2000?

Defina uma Gramática Livre de Contexto, formalizada na notação de Backus-Naur (BNF), capaz de gerar a linguagem L = { anbmcn | n > 0 e m ≥ 0}. Em sua resposta, apresente o conjunto completo de regras de produção e identifique claramente o símbolo inicial da gramática.