Considere i = 1, j = 2, k = 3 e m = 2. O que cada
uma das seguintes instruções imprime?
a) printf( “%d”, i == 1 );
b) printf( “%d”, j == 3 );
c) printf( “%d”, i >= 1 && j
d) printf( “%d”, m
e) printf( “%d”, j >= i || k == m );
f) printf( “%d”, k + m = k );
g) printf( “%d”, !m );
h) printf( “%d”, !( j - m ) );
i) printf( “%d”, !( k > m ) );
j) printf( “%d”, !( j > k ) );
Passo 1
Fala, programador(a)! Tudo em cima?
Nesse problema, temos as seguintes variáveis:
Durante todo ele, usaremos essas variáveis em comparações e expressões. Em cada assertiva, precisamos determinar o resultado que o printf vai imprimir na tela, beleza? Ah, e vamos combinar de só rodar no compilador para conferir as respostas?! Esse problema é muito importante para te ensinar lógica de programação! Nessa questão, cada printf vai imprimir um desses valores booleanos: caso a expressão seja verdadeira, será impresso o 1, que representa true/verdadeiro. Se for falsa, vai imprimir um 0 (false/falso).
Passo 2
Vamos começar com a letra A
O dado importante pra gente é que i = 1. O código que temos é: printf( “%d”, i == 1 ); Basicamente, o printf vai retornar o valor inteiro da comparação entre 1 e i. Esse símbolo de “==” questiona se um valor é igual ao outro (o que é diferente, em C, do “=”, que é o símbolo de atribuição. Enquanto i = 1 significa que eu estou dando o valor 1 para i, i == 1 questiona se o valor de i é igual a 1).
Como o valor de i de fato é 1, então o printf vai nos retornar o valor inteiro 1, que simboliza verdade (true). Vamos rodar o código no compilador e conferir? Lembrando que ele deve ser colocado da seguinte maneira:

O resultado abaixo:

Passo 3
Letra B
Já nesse caso, temos j = 2 e no printf temos a comparação entre o valor de j e o número 3, “printf(“%d”, j == 3);” Só que na verdade j vale 2, e não 3, então a comparação é falsa! Logo, o resultado impresso será 0 (falso).
Se quiser testar no seu compilador, abaixo estão o código e o resultado:


Passo 4
Letra C
Nesse item, temos “printf(“%d”, i >= 1 && j = 1 deve ser verdadeiro quanto j
Bom, i vale 1. Por isso, sabemos que i>=1 (i maior ou igual a 1) é verdadeiro.
O j, por sua vez, vale 2. Portanto, j é menor que 4 (2
Por isso, ambas as proposições são verdadeiras, logo, o printf vai imprimir(verdadeiro).
Para não restar dúvidas: Quando tivermos um &&, todas as comparações têm que ser verdadeiras pra resultar em verdadeiro, beleza? Se alguma não for, temos uma proposição falsa e nosso printf vai resultar em um 0 “bem oval”, haha!
Aqui temos o código para testar e seu resultado:


Passo 5
Letra D
Aqui, precisamos lembrar que o enunciado fala que k = 3 e m = 2. Temos “printf(“%d”, m
Assim como na c), iremos verificar se ambas são verdadeiras.
Como m = 2, e 2
Já para a segunda, temos que k
Como você já viu como é o padrão do código e o printf para verdadeiro e falso, não vou mais colocar daqui pra frente, ok?
Passo 6
Letra E
Nos temos “printf(“%d”, j >= i || k == m);”. Cara, esse operador “||” significa “ou”. Nesse caso, para que a gente considere a expressão toda verdadeira, basta que pelo menos uma das comparações seja verdadeira, de boa? Uma expressão com || só é falsa se todas as comparações são falsas!
Temos que j = 2, i = 1, k = 3 e m = 2.
A primeira comparação é j >= i. 2 >= 1 é verdadeiro, portanto, já sabemos que toda a expressão é verdadeira. Mas vamos continuar mesmo assim ☺
Queremos saber se k == m. Lembre que esse “==” é uma comparação que questiona se os dois valores são iguais. Em outras palavras, queremos saber se 3 (k) é igual a 2 (m). Como isso é absurdo, essa proposição é falsa.
Mas como no “ou” só precisamos que uma seja verdadeira, nosso printf vai imprimir 1 (verdadeiro).
Passo 7
Letra F
Uau, as coisas complicaram um pouco, hein? Mas nada que não possamos resolver! Aqui, temos algumas contas aritméticas bem tranquilas. Novamente, temos um ||, então se uma das comparações for verdadeira, a expressão toda é k + m
3 – j >= k. 3 – j é o mesmo que 3-2=1. Então, queremos saber se 1 >= 3. Isso também é loucura, caro(a) programador(a)! Essa parte também é falsa e, por isso, toda a expressão é.
Nosso printf vai imprimir 0 (falso).
Passo 8
Letra G
Ok, agora nos deparamos com um símbolo novo: “!”. O que ele significa na linguagem C? Cara, se colocamos o símbolo ! antes de uma variável, ela ganha o valor oposto naquela linha. Como assim? Pra deixar mais óbvio, vamos supor que colocamos o seguinte código: printf(“%d”, !0);
Tá, temos que 0 é falso, certo? E qual o contrário de falso? Verdadeiro, que geralmente é representado por 1. Logo, se eu rodar um código com esse trecho, vou obter 1 ☺
Aqui, temos: “printf(“%d”, !m);”. O valor de m é 2, Mas quanto vale !2? Bem, é preciso deixar claro aqui que o compilador entende 0 como falso e qualquer outro número como verdadeiro. Então, ao imprimir !m, temos o oposto de 2 (verdadeiro), que é falso, ou seja, 0.
Para ficar mais fácil, vamos a um esqueminha:

Passo 9
Letra H
Observa bem a tabelinha do item anterior, ela vai te ajudar muuuito agora! Temos nesse item “printf( “%d”, !( j - m ) );”. j – m é o mesmo que 2 – 2 que dá 0. E como já falamos no passo anterior, o oposto de 0 (falso) é 1 (verdadeiro). Logo, imprimimos 1.
Passo 10
Letra I
Novamente, precisaremos olhar bem a tabela do passo 8. Temos: “printf( “%d”, !( k > m ) );”. Como k = 3 e m = 2, estamos comparando, primeiro, 3 > 2, que dá verdadeiro. Mas temos um ! antes dessa expressão, então queremos o valor oposto dela. O oposto de verdadeiro (!verdadeiro) é falso, ou seja, 0. Vamos imprimir um 0.
Passo 11
Letra J
O item a seguir é bem parecido com o anterior. Mas, nesse caso, estamos comparando !(j > k). Primeiro, vamos avaliar se j > k é verdadeiro ou falso. J = 2 e k = 3, então estamos dizendo que 2 > 3, o que é falso. Mas !falso é verdadeiro, logo, vamos imprimir 1.
Resposta
1
0
1
0
1
0
0
1
0
1