Ir ao conteúdo
  • Cadastre-se

Teste de condicional IF em um jogo. Por que se eu testar o vencedor igual a zero funciona, e não igual a um?


Ir à solução Resolvido por vangodp,

Posts recomendados

Olá, este é meu primeiro tópico nesse fórum, não muito mexer aqui então vamos lá.

A alguns dias eu fiz um jogo da velha em C. Fiquei feliz ao fazer meu primeiro jogo mas vi que podia melhorar. Então, o que eu quero saber é por que ao fazer o teste da linha 38, da certo?

Código: http://pastebin.com/x0FwsnZE

 

O objetivo era fazer com que quando alguém vencesse, chamasse a função VENCEDOR(), exibisse a mensagem e terminasse o programa. Mas só consegui fazer isso testando se VENCEDOR() == 0.

 

Eu entenderia se fosse VENCEDOR() == 1. pois, como um dos testes da função seria verdadeiro, então iria entrar naquele escopo e terminaria o programa. Mas quando eu ponho == 1, já roda direto o teste e o programa termina.

 

E isso foi no chute mesmo, pra de algum jeito fechar o programa após exibir a mensagem de vencedor.

Por que zero?

Link para o comentário
Compartilhar em outros sites

  • Solução

Para entender isso você deve saber primeiro que é o que espera qualquer condicional. Uma condicional como if() simplesmente espera saber se o resultado de uma expressão é verdadeira ou falsa conforme as tabelas de verdades. por exemplo se eu fizer 1==1 vai devolver true ou seja 1, porque 1 realmente é igual a 1, outra coisa diferente é 1 == 2, nesse caso gera false, porque 1 é diferente a 2. Quer saber se o que eu digo é verdade, gostaria de ver com seus próprios olhos? Pois teste aí:

printf ("%d", (1==1) ); //verdadeiro vai imprimir 1sao iguais

printf ("%d", (1==2) ); //falso 1 é diferente de 2 imprime zero

printf ("%d", (1<10) ); //verdadeiro, 1 é menor que 10, imprime 1

printf ("%d", (1>10) ); //falso 1 é menor que 10 não maior, imprime zero

printf ("%d", !(1==1) ); //verdadeiro, deveria imprimir 1, porém o operador de negação(!) que esta adiante inverte o resultado a zero.

....

Como sua função retorna 0 em todos os casos VENCEDOR() == 0 é exatamente 0 == 0, zero é igual a zero? Sim! Então é verdadeiro e por isso entra ao você comparar com zero. faça o teste printf ("%d", (VENCEDOR() == 0) )... vai imprimir 1, porque 0 é igual a zero, e não, zero é igual a 1. Lembre que ao if o que importa é true o false SEMPRE.

 

Agora vamos ver os operadores...

a == b igualdade. Ele quer saber se 2 números são iguais, se for assim então ele devolve true, se são diferentes devolve falso

a < b menor que. devolve true se o operador da esquerda é menor que o da direita, se não devolve false.

a > b maior que. A mesma coisa só que quer saber se o da esquerda é maior que o da direita, se for assim devolve true, senão, false.

a <= b menor ou igual. true se a é menor ou igual que b, senão devolve false.

a >= b maior ou igual. true se a é maior ou igual que b, senão devolve false traz a avaliação.

a != b diferencia. Se a é diferente de b então devolve true, é o contrario de == que devolve true quando são iguais, != devolve verdadeiro ao serem diferentes.

a && b "a e b verdadeiros?" se a e verdadeiro e b também devolve verdadeiro senão devolve falso. Lembrando que falso é 0 e verdadeiro é tudo o que for diferente de zero, incluindo números negativos são considerados verdadeiros.

a || b "a ou b verdadeiros?" devolve verdadeiro se ao menos um ou ambos forem verdadeiros, e só devolve falso se ambos forem falsos. Se a for verdadeiro, a comprovação se detêm, pois o que interessa saber é se pelo menos um deles é verdadeiro, se a é verdadeiro não ha necessidade de checar b.

 

!a Operador negação. Se a for verdadeiro, o operador de negação o inverte a falso, igualmente se for falso ele o inverte para verdadeiro. Se imprimir printf ("%d", !10 ); vai imprimir zero, por que o 10 é verdadeiro, porém como leva o ! adiante inverte a false. Se fizer printf ("%d", !0 ); imprime 1 por que 0 invertido é true. Se por adiante de um resultado como !(1==1) da falso, porém tem que por as () para separar uma coisa da outra.

 

Espero não ter esquecido algum operador, porém você pode buscar informação mais completa por internet.

 

Não se importe com isso, que o programa entre no if somente quando VENCEDOR() for igual a falso não quer dizer nada, o importante é você saber por que ta entrando e que você tenha tudo baixo controle, se ainda assim não estiver satisfeito, troque os return 0 por return 1 e tudo solucionado, você já pode fazer VENCEDOR() == 1, mas é pura estética. XD

 

Hasta luego! XD :P

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...