:TITLE: Comparações Numéricas 101 - if
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl8.lsn,v 1.13 2000/04/24 16:17:53 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 29/12/2005
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
Tcl utiliza um construtor if similar àquele que é usado por outras linguagens.
A sintaxe é:
<P><UL>
<B>if</B> <I>expr1</I> ?then? <I>corpo1</I> 
<B>elseif</B><I> expr2</I> ?then? <I>corpo2</I>
<B>elseif</B> ... 
<B>?else?</B> <I>?corpoN?</I>
</UL>
<P>
As palavras <CODE>then</CODE> e <CODE>else</CODE> são opcionais, e podem ser
incluídas se você achar que elas melhoram a legibilidade do código, ou 
deixá-las de fora se você preferir.
<P>
A expressão de teste seguinte à palavra <CODE>if</CODE> é avaliada da mesma
forma que no comando <B>expr</B>. Strings hexadecimais 0xXX serão convertidas
para seus equivalentes numéricos antes da avaliação.
<P>
A expressão de teste seguinte a <CODE>if</CODE> deveria retornar um dos seguintes
valores:
<PRE>
<B>                      False            True
                      -------          ------ </B>
 um valor numérico    0                todos os demais
 no/yes               no               yes
 false/true           false            true
<P></PRE>
O caso de um retorno textual não é checado.
<P>
A expressão de teste seguinte a <CODE>if</CODE> pode ser delimitada
por aspas duplas, ou chaves. Se a expressão estiver delimitada por
chaves, ela será avaliada dentro do comando if, e o if delimitado
por aspas duplas será avaliado durante a fase de substituição, e
então outra rodada de substituições será feita dentro do comando
<B>if</B>.
:TEXT_END:
<P>
:LESSON_TEXT_START_LEVEL 1:
Como muitas linguagens, Tcl suporta um comando if. A sintaxe é:
<P><UL>
<B>if</B> <I>expr1</I> ?then? <I>corpo1</I> 
<B>elseif</B><I> expr2</I> ?then? <I>corpo2</I>
<B>elseif</B> ... 
<B>?else?</B> <I>?corpoN?</I>
</UL>
<P>
As palavras <CODE>then</CODE> e <CODE>else</CODE> são opcionais e podem
ser incluídas se você achar que elas melhoram a legibilidade, ou deixá-las 
de fora. Se você usou uma linguagem de programação como 
script shell, você pode querer deixá-las. Se você já usou C, você irá
preferir deixá-las de fora.
<P>
A expressão de teste seguinte a <CODE>if</CODE> deveria retornar um dos seguintes
valores:
<PRE>
<B>                      False            True
                      -------          ------ </B>
 um valor numérico    0                todos os demais
 no/yes               no               yes
 false/true           false            true
<P></PRE>
Se a expressão de teste retorna uma string "yes"/"no" ou "true"/"false", 
o caso do retorno não é checado. True/FALSE ou YeS/nO são retornos válidos.
<P>
Se a expressão de teste é avaliada como True, então <I>corpo1</I> será executado. 
<P>
Se a expressão de teste é avaliada como False, então a palavra depois de
<I>corpo1</I> será examinada. Se a próxima palavra for <CODE>elseif</CODE>, 
então a próxima expressão de teste será testada como uma condição. Se
a próxima palavra for <CODE>else</CODE> então o <I>corpo</I> final será
avaliado como um comando.
<P>
A expressão de teste seguinte à palavra <CODE>if</CODE> é avaliada da mesma
maneira que no comando <B>expr</B>. Strings hexadecimais 0xXX serão convertidas
para seus equivalentes numéricos antes da avaliação.
<P>
A expressão de teste seguinte a <CODE>if</CODE> pode ser delimitada por
aspas duplas, ou chaves. Se a expressão for delimitada por chaves, ela
será avaliada dentro do comando if, e se for delimitada por aspas duplas
ela será avaliada durante a fase de substituição, e então outra rodada
de substituições será feita dentro do comando <B>if</B>.
:TEXT_END:
<P>
:LESSON_TEXT_START_LEVEL 2:
O comando switch permite a você comparar uma string com outras strings
e encontrar um caso compatível. Outra característica da maioria das
linguagens de computador é a habilidade de escolher entre dois cursos
de ação baseado em um teste numérico. Como outras linguagens, Tcl
suporta essa funcionalidade com o comando <I>if</I>.
<P>
A sintaxe para o comando <I>if</I> é:
<P><UL>
<B>if</B> <I>expr1</I> ?then? <I>corpo1</I> 
<B>elseif</B><I> expr2</I> ?then? <I>corpo2</I>
<B>elseif</B> ... 
<B>?else?</B> <I>?corpoN?</I>
</UL>
<P>
As palavras <CODE>then</CODE> e <CODE>else</CODE> são opcionais. Você pode
inclui-las se você achar que elas melhoram a legibilidade do seu código, ou
deixá-las de fora se você achar que parece melhor.
<P>
Quando um comando <CODE>if</CODE> é encontrado, o interpretador Tcl
avalia <I>expr1</I> utilizando o comando <B>expr</B>. Se aquele teste
for verdadeiro, o interpretador Tcl executa <I>corpo1</I>. Se a expressão
de teste é avaliada como False, então a palavra depois de <I>corpo1</I> 
será examinada. Se a próxima palavra for <CODE>elseif</CODE>, então a
próxima expressão será avaliada como uma condição de teste. Se a próxima
palavra for <CODE>else</CODE> então o <I>corpo</I> final será
avaliado como um comando.
<P>
A expressão de teste seguinte a <CODE>if</CODE> deveria retornar um dos seguintes
valores:
<PRE>
<B>                      False            True
                      -------          ------ </B>
 um valor numérico    0                todos os demais
 no/yes               no               yes
 false/true           false            true
<P></PRE>
Se a expressão de teste retorna uma string de caracteres como "yes", 
"no", "true" ou "false", o caso do retorno não é checado. "True", "FALSE",
"YeS" ou "nO" são retornos válidos. 
<P>
O teste seguinte a <CODE>if</CODE> pode ser delimitado por aspas duplas
ou chaves. Se o teste estiver delimitado por chaves, ele será 
tratado pelo comando expr, dentro do comando <B>if</B>. 
Se o teste estiver delimitado por aspas duplas, substituições
serão feitas durante o tratamento da fase de substituição Tcl, e
então outra rodada de substituições será feita dentro do comando
<B>if</B>.
<P>
Como o teste em um <CODE>if</CODE> é avaliado da mesma forma que sno
comando <B>expr</B>, strings hexadecimais 0xXX serão convertidas para
seus equivalentes numéricos antes da avaliação. Você pode pensar que
os <I>testes</I> no comando <CODE>if</CODE> estão sendo executados
pelo comando expr, e todas as mesmas regras serão aplicadas.
<P>
<CODE>if {$i == 1} {puts ENCONTRADO}</CODE>
<P>é o mesmo que:<P>
<CODE>if {[expr $i == 1]} {puts ENCONTRADO}</CODE>
<P>
O <I>corpo</I> do código pode ser delimitado por aspas duplas ou chaves.
Como o <I>corpo</I> será avaliado da mesma forma que qualquer outro
comando Tcl, o <I>corpo</I> pode ser colocado dentro de chaves e a
substituição de variável irá ocorrer. Note que a abertura de aspas
duplas ou chaves deve estar na mesma linha que o comando if.
:TEXT_END:
:CODE_START:
set x 1;

if {$x == 2} {puts "$x é 2"} else {puts "$x não é 2"}

if {$x != 1} {
  puts "$x é != 1"
  } else {
  puts "$x é 1"
  }

if $x==1 {puts "PEGUEI 1"}

;# Dois passos de substituição serão feitos nesta string de teste
;# O passo inicial substitui $y com x
;# Dentro da declaração if, $x é substituído com 1

set y x;
if "$$y != 1" {
  puts "$$y é != 1"
  } else {
  puts "$$y é 1"
  }
:TEXT_END: