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:

i   =   1

j   =   2

k   =   3

m   =   2

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

a . 1

b . 0

c .   1

d .   0

e .   1

f .   0

g .   0

h .   1

i .   0

j .   1