Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - If then else.. :)


Aya - Mo 03.02.03 16:48
Titel: If then else.. :)
Hi,

es gibt ja in einigen anderen Programmiersprachen (C, PHP etc) eine verkürzte Form von If-Then-Else...

in etwa so:

Quelltext
1:
Statement1:Statement2?Statement3;                    

das entspricht demselebn wie dashier:

Quelltext
1:
If Statement1 then Statement2 else Statement3;                    


weiß jemand ob's das in Delphi auchgibt??

Au'revoir,
Aya~

PS: Hab grad nen "Bug" im Forum gefunden... *g* markiert mal irgendwo hier auf der Seite (Thema Schreiben) nen paar buchstaben, und dann klickt auf z.B. "Code"... *gg*


AXMD - Mo 03.02.03 16:55

Hi,

soweit ich weiß nicht. Wieso denn? if-then-else ist doch auch nicht sooo lang :wink:

AXMD


Tower - Mo 03.02.03 17:11

In Grenzen kann man das "simulieren":


Quelltext
1:
2:
3:
  [...]
  i := IfThen(a > b, 1, 2);
  [...]


steht für


Quelltext
1:
2:
3:
4:
5:
6:
  [...]
  if a>b then
    i:=1
  else
    i:=2;
  [...]


Einfach mal in der Hilfe nach "IfThen" gucken...


Christian S. - Mo 03.02.03 18:36

IfThen: Den kannte ich auch noch nicht. Finde ich aber genauso unübersichtlich wie den Konditionaloperator (so heißt das Vieh glaube ich).

In Java sind Doppelpunkt und Fragezeichen übrigens vertauscht.

Den Bug finde ich witzig. :lol:

MfG,
Peter


Raphael O. - Mo 03.02.03 18:59

Häh wo solln da ein Bug sein??? :oops: :?: :?:

Fiji-Fighter


Christian S. - Mo 03.02.03 19:03

Markiere im Fenster "Antwort schreiben" mal z.B. etwas im Text "Nachrichtentext" und klicke dann auf "Code".


Raphael O. - Mo 03.02.03 19:16

Was habt ihr denn für Browser??
bei mir klappts nicht bzw. find ich da jedenfalls nichts lustig:
ich habe
Zitat:
nachrichtentext

markiere es, klicke auf "Code" und danach steht das da:
Zitat:
["code"]nachrichtentext[/code]


"code" ist natürlcih normal nicht in " " " ;)

ist doch alles normal oder nicht?? :roll:

Fiji-Fighter


Christian S. - Mo 03.02.03 19:24

Ich bin mir nicht ganz sicher, ob wir vom selben reden. Du kannst das ganze auch mit dem blau unterlegten Titel "Antwort schreiben" machen. Es ist ganz einfach nur witzig, dass man Code-Tags auch außerhalb der Memobox setzen kann, sondern in jeden Text auf der Seite. Selbst auf die Angabe für die Zeitverschiebung.


Raphael O. - Mo 03.02.03 19:31

*LOl* :rofl:
:autsch: Stand (mal wieder) auf der Leitung :oops:

Ist ja echt cool...

habe gerade mein Memo verschwinden lassen irgendwie...

Danke für die Erklärung...

:angel: sorry admins & Mods, weil das ja eigentlich offtopic wäre...
aber dafür nen extra thread wär auch net das wahre oder??? :angel:

Fiji-Fighter


Brueggendiek - Di 04.02.03 05:11

Hallo!

Nachdem sich einige über den Bug aufgeregt haben (tatsächlich gut :mrgreen:), nun noch was konstruktives.

Der IfThen-Befehl enthält eine böse Falle!

Quelltext
1:
2:
3:
if bedingung then
  wert := funktion1 else
  wert := funktion2;

Wenn "bedingung" erfüllt ist, wird "funktion1" ausgeführt und "wert" erhält deren Ergebnis, wenn "bedingung" nicht erfüllt ist, wird "funktion2" ausgeführt und "wert" erhält deren Ergebnis. Das bedeutet, es wird nur eine der beiden Funktionen ausgeführt.
Anders bei

Quelltext
1:
wert := IfThen(bedingung, funktion1, funktion2);                    

Hierbei werden beide Funktionen ausgeführt, um die Werte für IfThen zu berechnen, dann wird je nach Ergebnis von "bedingung" einer der Werte benutzt und an "wert" übergeben. Kann unerwünschte Nebeneffekte haben!

Irgendwo fand ich mal die Frage:

Quelltext
1:
2:
3:
4:
function fact(n: integer): integer;
begin
  result := IfThen (n>1, 1, fact(n-1));
end;

führe zum Stacküberlauf - logisch, weil ja die Rekursion ja immer aufgerufen wird und der Speicher nicht unendlich ist.

Da hätte ich auch noch einen:

Quelltext
1:
zeichen := IfThen(length(satz)<5, #0, satz[5]);                    

fällt bei AnsiString (normale Strings) garantiert auf die Nase!

Oder, um mal einen Werbespruch zu erfinden:
IfThen - die neue Möglichkeit, unübersichtlich zu programmieren!

Nebenbei: in SIMULA kann man schreiben:

Quelltext
1:
wert := if bedingung then 1 else 2;                    

SIMULA 67 wurde übrigens am Norwegian Computing Center in Olso für Simulationsprobleme aus ALGOL 60 entwickelt und war wohl die erste objektorientierte Sprache - wie der Name sagt von 1967!

Gruß

Dietmar Brüggendiek


Delete - Di 04.02.03 07:30

Wer solch ein Konstrukt benutz, der kann seine Anwendung selber debuggen. "Ohne mich", sage ich da. :evil:


Delete - Di 04.02.03 09:34
Titel: Re: If then else.. :)
Aya hat folgendes geschrieben:
es gibt ja in einigen anderen Programmiersprachen (C, PHP etc) eine verkürzte Form von If-Then-Else... weiß jemand ob's das in Delphi auchgibt??

Genau so? Nein. Aber Hagen Reddmann aus dem Entwickler-Forum brachte mich auf eine Alternative, die ich seit einiger Zeit z.B. für sich ändernde Menütexte usw. nutze.

Dazu verpackt man die gewünschten Daten (ob nun Text o.ä.) in ein Bool-Array

Quelltext
1:
2:
3:
4:
5:
const
  cStatementArray : array[boolean]of cardinal =
    (0,MF_GRAYED);
  cTextArray : array[boolean]of string =
    ('aus','an');

z.B., wobei es -wie man sehen kann!- auf den Typ ankommt. Das ganze lässt sich nun ohne if-then-Klausel im Quellcode nutzen:

Quelltext
1:
2:
AppendMenu(hm,MF_STRING or cStatementArray[fEnable],
  IDC_MENUITEM1,cTextArray[fOn]);

Normalerweise hätte ich zwei if-then-Klauseln schreiben müssen. Eine, bei der geprüft wird ob der Menüeintrag normal oder deaktiviert dargestellt werden soll. Und noch mal eine für den Menütext selbst, der sich ja auch ändern kann.

Also, ich denke, das kürzt ganz schön. Und übersichtlich und leicht verständlich dürfte es trotzdem noch sein. :) Oder?


maximus - Di 04.02.03 14:10

:roll: wo wir grad beim thema sind:

ich schreib gern

Quelltext
1:
2:
3:
4:
case a>b of
  true : doBla();
  false: doGna();
end;


was ist schneller if oder case oder beides? :lol: bzw spricht irgenwas gegen case oder is es nur geschmacksache?

mfg mx


Delete - Di 04.02.03 15:07

case ist hilfreich, wenn eine Variable mehr als zwei Werte annehmen kann. Dann ersparst du dir auf jeden Fall eine Menge verschachtelter if-Anweisungen.
Gegen deine Methode spricht also nichts; im Prinzip nutzt jeder das, was ihm am besten gefällt und womit er die wenigsten Schwierigkeiten hat.

btw: Diese IfThen-Anweisung, die Tower ansprach, gibt´s wohl erst in neueren Delphi-Versionen? In D5 existiert sie offenbar noch nicht. :? Aber macht ja nichts, ´s gibt ja Alternativen.


Tower - Di 04.02.03 15:19

Echt? Hmmm... könnte schwören, ich hab die auch schon unter D5-Projekten benutzt...
Nagut, vielleicht vertu' ich mich da aber auch... ;)

Allerdings hat maximus eine interessante Frage aufgeworfen, finde ich: Dass sich Case- und If-Anweisungen optisch unterscheiden, ist ja klar, aber: Tun die sich performance-mäßig auch nichts?

Ist nach der Kompilierung


Quelltext
1:
2:
3:
4:
5:
case a of
  1: ...
  2: ...
  3: ...
end;


dasselbe wie


Quelltext
1:
2:
3:
4:
5:
6:
if a=1 then
  ...
else if a=2 then
 ...
else if a=3 then
  ...


?


Delete - Di 04.02.03 15:31

Peter Lustig hat folgendes geschrieben:
In Java sind Doppelpunkt und Fragezeichen übrigens vertauscht.

In C und JavaScript auch. Ich denke, Aya hat sich schlicht vertan. Korrekt dürfte in jedem Fall das sein:

Quelltext
1:
Condition?Statement1(true):Statement2(false)                    


@Tower: Ich halte case für effizienter, aber das ist nur "subjektiv gefühlt". Ob´s der Wahrheit entspricht und tatsächlich schneller ist? Hm ...


maximus - Di 04.02.03 15:49

:arrow: um meine eigene frage mal zu beantworten:

IF gewinnt mit 5339683 time units gegenüber case mit 11392357 time units!

hab beide 1Mrd. mal laufen lassen und siehe da IF ist doppelt so schnell :D schade eigentlich! Aber für den normalen gebrauch ist das wohl irrelevant.

mfg mx


Aya - Di 04.02.03 15:53

hi,

ich denke mal im Compiler sähe das so aus:

Beim IF:


Quelltext
1:
2:
3:
4:
If A=1 then
  //...
else
  /...


Beim Case:

Quelltext
1:
2:
3:
4:
If A=1 then
  //...
If A=2 then
  //...


Das würde die doppelte geschwindigkeit erklären.. :)


maximus - Di 04.02.03 15:56

allerdings würde er 'A=1' nur einmal ausrechnen:

Quelltext
1:
2:
3:
res := A=1;
if res = true then...break;
if res = false then...;

möglicherweise

Moderiert von user profile iconTino: Code-Tags hinzugefügt.