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
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
Tino: Code-Tags hinzugefügt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!