Boa parte das operações com um algoritmo deve executar é tomar uma decisão. Além de seguir o fluxo normal ou desviar e fazer manipulações de dados, é só o que precisa fazer.

A decisão precisa ser simples, o computador não é um humano que pode processar coisas complexas de uma vez. A decisão precisa ser sim ou não, ou faz ou não faz algo. O computador só sabe lidar com zeros e uns. Todo o resto é uma abstração juntando vários desses 0s e 1s.

Uma forma de dar nome para esses números tão básicos é chamá-los de falso e verdadeiro.

Então false e true são palavras chave usadas para denominar os valores básicos em algo que é usado como uma decisão. Não é que o valor seja a decisão em si, mas são os valores possíveis de uma decisão. Sempre que precisar dizer que algo é falso ou verdadeiro pode, ou até deve, usá-los.

Isso vale para quase qualquer linguagem (algumas usam só 0 e 1 diretamente com significado especial, ou até qualquer valor que não seja 0 para verdadeiro, e algumas pode ter uma sintaxe um pouco diferente, mas dizem o mesmo). Inclusive se não estiver usando um dialeto diferente e esquisito em Portugol seria falso e verdadeiro.

Quando uma variável só aceita esses valores ela deve ser declarada com o tipo chamado logico. Assim é garantido que não aceita nada diferente disso.

Então pode só atribuir um valor de forma direta (lembrando que essas variáveis são sempre lógicas):

  • variavel := verdadeiro; 

Pode usar um operador que o resultado é um valor lógico:

  • status := x > 0; //ou dá falso ou dá verdadeiro 

Ou pode chamar uma função cujo resultado seja um valor do tipo lógico.

E claro, o resultado lógico pode ser usado em um comando que toma uma decisão. Esse comando sempre espera um valor lógico para tomar a decisão e acho que é óbvio que ele só entra em um comando ou bloco se o valor for verdadeiro. Exemplo:

  • se idade >= 18 então 

ou

  • enquanto nome <> "" faça 

Por isso se pegarmos uma das variáveis acima e fizer

  • se status então 

funciona como o esperado porque essa variável é lógica e um se espera um valor lógico, tudo dá certo. Algumas pessoas preferem fazer:

  • se status = verdadeiro então 

Em geral quando a pessoa faz isso ela não entendeu ainda para que serve um valor lógico. E se ela aprendeu errado, e fizer muitas vezes, ela não consegue mudar. Aí terá que arrumar uma desculpa para continuar usado, provavelmente dizendo que assim fica mais legível, mas não fica. Se ficasse ela passaria fazer algo como:

  • status := (x + 0) > 10; 

Por que fez a soma com zero? Pra ficar mais legível. Faz sentido? Não faz. É exatamente a mesma coisa que ela fez no comando anterior. Como é um conceito novo ela acha que faz sentido, mas só mostra que ainda não entendeu a ideia do valor lógico.

Portugol é uma das linguagens que tratam qualquer valor que não seja um falso ou 0 ou "" ou '' como verdadeiro. Eu acho isso terrível para uma linguagem de aprendizado, por isso não recomendo JavaScript, PHP, Python e outras, como C, como linguagens ideais para aprender programar (eu ainda acho C interessante por outros motivos). Elas introduzem confusão porque aplicam tipagem fraca (nesse ponto Python quebra a promessa de ser tipagem forte). Na verdade a crítica é em cima de Portugol porque é uma linguagem tão abstrata e resolve ser concreta onde não devia. Mas esse é outro assunto, não vou me estender.

Então isto executa infinitamente:

  • enquanto 10 faça 

Coloquei no GitHub para referência futura.

10 é automaticamente um verdadeiro e por ser um literal nunca mudará de estado e portanto é infinito (pode ter algo dentro do laço que mande encerrar, mas é outra estória).

Entenda que você usa mais o conceito dos valores lógicos do que eles de forma literal, pelo menos em exercícios simples. Se criar uma variável onde escreve explicitamente que ela tem o valor verdadeiro em vez de obter esse valor por uma operação provavelmente a variável ali é uma flag, e esse tipo de construção mostra que o algoritmo não foi bem pensado.

Isso muda quando é usado em uma estrutura de dados e a intenção é armazenar por algum tempo em um objeto na memória ou persistido um valor que é verdadeiro ou não. Você poderia ter um objeto que tem um campo chamado pago que poderia ter o valor falso enquanto aquilo não tivesse sido quitado ainda, e mudado para verdadeiro quando alguém fizesse o pagamento. Apesar disso aparecer de forma mais direta com os valores, para usar certo envolve o conceito de composição de objetos que só deveria ver depois de dominar bem a parte de algoritmos.

Operadores que resultam em um valor lógico (ainda que todos os valores podem ser interpretados como lógicos): oue=<>>>=<<=não.

Então deve usar quando precisa de um estado que pode ter só dois valores e a semântica desse valor é se é um sim ou não.

Só cuidado para não interpretar algo que por acaso tem dois valores e não ser bem um sim ou não. Um estado civil é melhor que um estado de casado, sim ou não, o mesmo para sexo, até um "sensitivo a caixa alta" que é um sim ou não pode ser melhor ser mais específico e dizer se é "caixa alta" ou "caixa baixa", aí envolve outro conceito mais avançado, também não vou aprofundar.

Se não encontrou muitos exemplos e exercícios usando isso talvez não seja um bom material. Não é o caso de suprir essa deficiência aqui. Inclusive aprender na sequência e contextos errados pode trazer prejuízos. Eu sempre falo da importância de ter bons materiais.

Quer saber mais detalhes sobre o assunto ou algo correlato? Faça perguntas específicas (se já não tem, pesquise antes) e me marque para responder. Responderei o que der e me motivar.

Futuramente farei algo que muitos pedem para aprender programar corretamente. Para não perder me segue nas suas plataformas preferidas. Verá que não posto quase nada, não terá infindas notificações. Nas que não notificam já posto muita coisa que pode te interessar já (links aqui - aproveite para ler meu disclaimer no final do readme)