Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Que esta indicando esta expresión? (https://www.clubdelphi.com/foros/showthread.php?t=88525)

franco_cvm 17-06-2015 07:44:44

¿Que esta indicando esta expresión?
 
Hola, navegando por Internet, encontré un código de lista de punteros y me surgió curiosidad de la forma en que escribió una sentencia de WHILE, donde la variable bandera es un booleano:
Código Delphi [-]
While (bandera) do
yo siempre estaba acostumbrado a poner
Código Delphi [-]
While (bandera=false) do
o esta
Código Delphi [-]
While (bandera=true) do

¿que significa cuando la variable esta sola?

acá el código completo, ordena la lista de menor a mayor según la información de los nodos:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  ULT,X,Y,Z: pnodo;
  bandera:Boolean;
  aux:integer;
BEGIN
ULT:=nil;
bandera:=True;
While (bandera) do
  Begin
    X:=CZO^.prox;
    Y:=X^.prox;
    bandera:=False;
    While (Y<>ULT) do
      begin
        if (X^.data)>(Y^.data) then
          begin
            bandera:=true;
            aux:=x^.data;
            X^.data:=Y^.data;
            Y^.data:=aux;
          end;
        X:=Y;
        Y:=Y^.prox;
      end;
      if (Y=ULT) then
          ULT:=X;
    End;
   Z:=CZO;
While (Z^.prox)<>nil do
  begin
  Z:=Z^.prox;
  memo2.Lines.Add(inttostr(Z.data));
  end;
END;

AgustinOrtu 17-06-2015 09:12:22

Cuando esta sola es lo mismo que decir = True

Para comparar por falso podes usar el operador not


Código Delphi [-]
  while not archivo.Eof do
  \\ código

ecfisa 17-06-2015 09:41:30

Hola franco_cvm.

El tipo Boolean enumera los valores verdadero o falso. Cuando en Delphi haces una comparación del tipo,
Código Delphi [-]
 if (a = b) then
de "(a = b)" se obtiene un resultado que puede ser verdadero o falso según sean los contenidos de 'a' y 'b'. Supongamos que,
Código Delphi [-]
var
  B : Boolean;
begin
  B := ( 5 = 5)
la variable "B" recoge un valor (que es True en el código anterior) y ya debes ver claro que: B = (5 = 5) = True. Entonces la construcción,
Código Delphi [-]
 if (B = True) ...
si bién no es sintácticamente incorrecta, es redundante.

Una variable de tipo booleana almacena la conclusión de una o mas premisas, y su resultado puede ser bivalente (True o False). De allí que es reiterativo evaluar la igualdad por verdadero o falso si la variable ya posee ese valor.

Resumiendo, si B tiene el valor True hacer:
Código Delphi [-]
 if  B  then
tiene el mismo resultado que:
Código Delphi [-]
 if B = True then

Del mismo modo que si B tiene el valor False hacer:
Código Delphi [-]
 if not B then
tiene el mismo resultado que:
Código Delphi [-]
 if B = False then
Y aunque el compilador es generoso, mi consejo es que no uses el modo redundante.

Saludos :)

Edito: No había visto el mensaje de Agustín mientras escribía pero es la misma idea.

franco_cvm 17-06-2015 14:23:39

Graciass

lo que no entiendo es porque si pongo:
Código Delphi [-]
begin
ULT:=nil;
While (bandera=true) do
  Begin
    X:=CZO^.prox;
    Y:=X^.prox;
    bandera:=False;
    While (Y<>ULT) do
      begin
        if (X^.data)>(Y^.data) then
          begin
            bandera:=true;
            aux:=x^.data;
            X^.data:=Y^.data;
            Y^.data:=aux;
          end;
.......


Cita:

Empezado por ecfisa (Mensaje 493390)
Hola franco_cvm.

El tipo Boolean enumera los valores verdadero o falso. Cuando en Delphi haces una comparación del tipo,
Código Delphi [-]
 if (a = b) then
de "(a = b)" se obtiene un resultado que puede ser verdadero o falso según sean los contenidos de 'a' y 'b'. Supongamos que,
Código Delphi [-]
var
  B : Boolean;
begin
  B := ( 5 = 5)
la variable "B" recoge un valor (que es True en el código anterior) y ya debes ver claro que: B = (5 = 5) = True. Entonces la construcción,
Código Delphi [-]
 if (B = True) ...
si bién no es sintácticamente incorrecta, es redundante.

Una variable de tipo booleana almacena la conclusión de una o mas premisas, y su resultado puede ser bivalente (True o False). De allí que es reiterativo evaluar la igualdad por verdadero o falso si la variable ya posee ese valor.

Resumiendo, si B tiene el valor True hacer:
Código Delphi [-]
 if  B  then
tiene el mismo resultado que:
Código Delphi [-]
 if B = True then

Del mismo modo que si B tiene el valor False hacer:
Código Delphi [-]
 if not B then
tiene el mismo resultado que:
Código Delphi [-]
 if B = False then
Y aunque el compilador es generoso, mi consejo es que no uses el modo redundante.

Saludos :)

Edito: No había visto el mensaje de Agustín mientras escribía pero es la misma idea.


ecfisa 17-06-2015 14:54:24

Hola franco
Cita:

Empezado por franco_cvm (Mensaje 493391)
Graciass

lo que no entiendo es porque si pongo:
Código Delphi [-]
begin
ULT:=nil;
While (bandera=true) do
  Begin
    X:=CZO^.prox;
    Y:=X^.prox;
    bandera:=False;
    While (Y<>ULT) do
      begin
        if (X^.data)>(Y^.data) then
          begin
            bandera:=true;
            aux:=x^.data;
            X^.data:=Y^.data;
            Y^.data:=aux;
          end;
.......

Tendrías que explicar que es lo que no entendes, por así como está planteado, no veo a donde apunta tu duda.

Saludos :)

Al González 17-06-2015 20:00:23

Después de la generosa explicación de ecfisa y con lo ya dicho por AgustinOrtu, difícilmente podría yo agregar algo importante. Baste decir que donde quiera que se espere una expresión Boolean, es decir, un fragmento de código que se evaluará o ejecutará dando por resultado un valor de falso o verdadero, puede ser colocada tanto una llamada a una función de resultado Boolean, como una variable o propiedad de tipo Boolean sola, o bien una combinación de otras expresiones (usando paréntesis y And, Or, etc.).

En la sentencia
Código Delphi [-]
If IsUpperCase ('ABC') Then
la expresión Boolean es: IsUpperCase ('ABC')

En la sentencia
Código Delphi [-]
If IsUpperCase ('ABC') = True Then
la expresión Boolean es: IsUpperCase ('ABC') = True

Al If entrará si la expresión evalúa a (resulta en) True. Así que si "IsUpperCase ('ABC')" es ya una expresión falso/verdadero, entonces no hay necesidad de hacer más compleja esa expresión añadiéndole una comparación con el signo de igual y la constante True ("IsUpperCase ('ABC') = True").

Ese If sería válido incluso si escribieras:
Código Delphi [-]
If ((IsUpperCase ('ABC') = True) = True) = True Then
Pero es mejor escribir código conciso:
Código Delphi [-]
If IsUpperCase ('ABC') Then
Y, como dije antes, lo mismo aplica a una variable o propiedad Boolean:
Código Delphi [-]
If MiVariable Then
De este modo, evitamos recargar a la aplicación con ciclos de CPU innecesarios, o, en caso de que el compilador simplifique las expresiones redundantes, al menos no ofuscamos el código fuente, dejándolo un poco más limpio y fácil de leer.

Al González.

ecfisa 17-06-2015 22:33:58

Agregando, también suele ser muy útil usar el tipo Boolean en los constant arrays para alternar valores de acuerdo a una condición:
Código Delphi [-]
const
  CCOLOR : array[Boolean] of TColor = (clRed, clLime);
begin
  Edit1.Color := CCOLOR[Edit1.Text > ''];
  ...

Saludos :)

nlsgarcia 17-06-2015 23:16:36

franco_cvm,

Cita:

Empezado por franco_cvm
...¿Que esta indicando esta expresión?...While (bandera) do...

:rolleyes:

Revisa esta información:
Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 17:29:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi