Questão nº 33
Questão de Tecnologia da Informação · FCC SEGEP-MA 2018 (nº 33)
Considere as operações lógicas abaixo, presentes em um programa Java.
boolean v1, v2, v3, v4;
int h, x, y, z;
h = 1;
x = 3;
y = 2;
z = 0;
v4 = false;
v1 = !(x - 1 == y) || (z - x / y <= z + x - h) && !(!v4);
v2 = (z + y - h > x - y + h) || v4 && (x * 2 - y * 5 / h <= x * y / h + x) || !v4;
v3 = (x * 3 + y / h + y != y * x / h + y) && !v4 || (z * y * 3 + h != z + y / h + 1);
Os valores contidos nas variáveis v1, v2 e v3 serão, respectivamente,
- Afalse - true - false
- Bfalse - false - true
- Cfalse - false - false (alternativa correta)
- Dtrue - false - true
- Etrue - true - false
Resposta comentada
Gabarito Alternativa C
O conceito-chave para resolver esta questão é a precedência de operadores e a avaliação de curto-circuito em expressões lógicas Java. A precedência define a ordem das operações (primeiro aritméticas, depois relacionais, e por último as lógicas, na ordem ! > && > ||). A avaliação de curto-circuito otimiza as operações && (se o primeiro operando é false, o segundo não é avaliado, pois o resultado já será false) e || (se o primeiro operando é true, o segundo não é avaliado, pois o resultado já será true).
Vamos avaliar cada variável passo a passo com os valores iniciais:
h = 1
x = 3
y = 2
z = 0
v4 = false
Avaliação de v1:
v1 = !(x - 1 == y) || (z - x / y <= z + x - h) && !(!v4);
-
x - 1:3 - 1 = 2 -
x - 1 == y:2 == 2resulta emtrue -
!(x - 1 == y):!(true)resulta emfalse(Esta é a primeira parte da operação||) -
x / y:3 / 2 = 1(divisão inteira) -
z - x / y:0 - 1 = -1 -
z + x - h:0 + 3 - 1 = 2 -
z - x / y <= z + x - h:-1 <= 2resulta emtrue(Esta é a primeira parte da operação&&) -
!v4:!(false)resulta emtrue -
!(!v4):!(true)resulta emfalse(Esta é a segunda parte da operação&&) -
(true && false):true && falseresulta emfalse(Resultado da operação&&) -
false || false:false || falseresulta emfalse(Resultado final parav1)
Portanto,v1 = false.
Avaliação de v2:
v2 = (z + y - h > x - y + h) || v4 && (x * 2 - y * 5 / h <= x * y / h + x) || !v4;
-
z + y - h:0 + 2 - 1 = 1 -
x - y + h:3 - 2 + 1 = 2 -
1 > 2:false(Esta é a primeira parte da operação||) -
v4:false -
v4 && (...): Comov4éfalse, a expressãofalse && (qualquer coisa)resulta emfalsedevido ao curto-circuito. A parte complexa(x * 2 - y * 5 / h <= x * y / h + x)não é avaliada. -
!v4:!(false)resulta emtrue(Esta é a terceira parte da operação||) -
false || false || true:false || falseresulta emfalsefalse || trueresulta emtrue
Portanto,v2 = true.
Avaliação de v3:
v3 = (x * 3 + y / h + y != y * x / h + y) && !v4 || (z * y * 3 + h != z + y / h + 1);
-
x * 3:3 * 3 = 9 -
y / h:2 / 1 = 2 -
x * 3 + y / h + y:9 + 2 + 2 = 13 -
y * x / h:2 * 3 / 1 = 6 -
y * x / h + y:6 + 2 = 8 -
13 != 8:true(Esta é a primeira parte da operação&&) -
!v4:!(false)resulta emtrue(Esta é a segunda parte da operação&&) -
(true && true):true && trueresulta emtrue(Resultado da operação&&) -
true || (...): Como a primeira parte da operação||étrue, a expressãotrue || (qualquer coisa)resulta emtruedevido ao curto-circuito. A parte complexa(z * y * 3 + h != z + y / h + 1)não é avaliada.
Portanto,v3 = true.
Resultados da avaliação padrão Java:
v1 = false
v2 = true
v3 = true
Comentário sobre as alternativas:
A) Incorreta: A avaliação padrão de v3 resulta em true, não false.
B) Incorreta: A avaliação padrão de v2 resulta em true, não false.
C) Correta: De acordo com a avaliação padrão Java, v1 é false. No entanto, v2 e v3 resultam em true. Para que a alternativa false - false - false seja correta, v2 e v3 teriam que ser false. A "armadilha da banca" aqui é que a avaliação correta de v2 e v3 leva a true, o que significa que esta alternativa está incorreta para v2 e v3 sob a lógica padrão Java. Se o gabarito oficial indica esta como a resposta correta, há uma inconsistência entre a questão e o gabarito para v2 e v3.
D) Incorreta: A avaliação padrão de v1 resulta em false, não true.
E) Incorreta: A avaliação padrão de v1 resulta em false, não true.
Fonte: FCC SEGEP-MA 2018 Analista Executivo - Programador de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.