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

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.

A função fun(&a) altera o valor de a (efeito colateral); logo, a ordem de avaliação dos operandos muda o resultado.

Questões como essa são exercícios teóricos clássicos de Paradigmas de Linguagens de Programação para analisar o impacto de efeitos colaterais sob ordens de avaliação assumidas.

Vamos resolver a expressão aritmética que calcula o valor de x, conforme as ordens de avaliação estabelecidas pelas assertivas.

I O valor de x será 34, caso o valor de a seja 10 e os operandos sejam avaliados da esquerda para a direita.

fun(&a) transforma a em 14 e retorna 2 * 14 + 1 = 29.

Avaliando os operandos da esquerda para a direita:

1) Avalia a → o valor original de a é 10.

2) Avalia fun(&a)a é alterado para 14 e retorna 29.

3) Avalia a / 2 → o valor de a agora é 14, então 14 / 2 = 7.

O valor de x é 10 + 29 - 7 = 32.

II O valor de x será 38, caso o valor de a seja 10 e os operandos sejam avaliados da direita para a esquerda.

fun(&a) transforma a em 14 e retorna 2 * 14 + 1 = 29.

Avaliando os operandos da direita para a esquerda:

1) Avalia a / 2 → o valor original de a é 10, então 10 / 2 = 5.

2) Avalia fun(&a)a é alterado para 14 e retorna 29.

3) Avalia a → o valor de a agora é 14.

O valor de x é 14 + 29 - 5 = 38.

III O valor de x será 57, caso o valor de a seja 20 e os operandos sejam avaliados da esquerda para a direita.

fun(&a) transforma a em 24 e retorna 2 * 24 + 1 = 49.

Avaliando os operandos da esquerda para a direita:

1) Avalia a → o valor original de a é 20.

2) Avalia fun(&a)a é alterado para 24 e retorna 49.

3) Avalia a / 2 → o valor de a agora é 24, então 24 / 2 = 12.

O valor de x é 20 + 49 - 12 = 57.

IV O valor de x será 61, caso o valor de a seja 20 e os operandos sejam avaliados da direita para a esquerda.

fun(&a) transforma a em 24 e retorna 2 * 24 + 1 = 49.

Avaliando os operandos da direita para a esquerda:

1) Avalia a / 2 → o valor original de a é 20, então 20 / 2 = 10.

2) Avalia fun(&a)a é alterado para 24 e retorna 49.

3) Avalia a → o valor de a agora é 24.

O valor de x é 24 + 49 - 10 = 63.

Conforme exposto, a resposta correta é:

C apenas as assertivas II e III.