Seite 2 von 2

Re: Inline-If

Verfasst: 07.03.2016 17:46
von Nino
STARGÅTE hat geschrieben:@Nino:
>> "Auch wenn man das normale "If" benutzt darf man nicht durch 0 dividieren."
Richtig, aber beim normalen If, frage ich das ja vorher auch ab, ob x<>0 und lasse dann nur 1/x zu!
Ja, sicher. Aber was ich sagen wollte ist, dass du hier an den Fall "x = 0" denken musst, und dich irgendwie darum kümmern musst. Beim Inline-If muss ich das eben auch tun, so what? D.h. in einer Situation in der x = 0 sein kann, würde ich es mit 1/x nicht benutzen. Das waren in meiner bislang über 25-jährigen Programmierpraxis allerdings Ausnahmefälle. Wieso sollte ich nur wegen dieser Ausnahmefdälle das Inline-If generell ablehnen? Man muss immer wissen, welches "Werkzeug" man wo und wie einsetzen kann und darf. Und das gilt eben auch für das normale "If", das wollte ich sagen.
Für das Inline-If gibt es -- wie ich finde -- sehr elegante Anwendungen (s.u.).
mhs hat geschrieben:Im einem anderen Thread (http://purebasic.fr/german/viewtopic.ph ... 0&start=10) hatte ich schon mal meine Variante gepostet. Total simpel, dafür nicht komplett Inline, weil die Result Variable mit als Paramter übergeben werden muss... dafür ohne Performanceverlust, doppelter Ausführung der Expression... ist ja schließlich nur ein simples If : Else :lol:
Ich finde, für diese Variante spricht durchaus einiges.
Allerdings funktioniert einer meiner Lieblingsanwendungsfälle nur mit der anderen Variante, die sich wie eine Funktion aufrufen lässt:

Code: Alles auswählen

selected = 3
StatusBarText(0, 0, Str(selected) + " Datei" + IifS(selected <> 1, "en", "") + " ausgewählt.")

Re: Inline-If

Verfasst: 07.03.2016 21:16
von Sicro
STARGÅTE hat geschrieben:Speziell geht es um die Problematik, dass beide Zustände (True und False) immer ausgeführt werden
Es gibt zwei Arten von Inline-If:
  • Funktion: wertet beide Zustände aus
  • Operator: wertet nur den zutreffenden Zustand aus
Das selbst gebastelte Inline-If ist die Funktion-Variante, wie sie auch in Visual Basic implementiert wurde (https://en.wikipedia.org/wiki/%3F:#Visual_Basic).
Die Operator-Variante wird wohl nur Fred per native Implementierung realisieren können.
https://en.wikipedia.org/wiki/%3F:#Usage hat geschrieben:Note that some languages may evaluate 'both' the true- and false-expressions, even though only one or the other will be assigned to the variable. This means that if the true- or false-expression contain a function call, that function may be called and executed (causing any related side-effects due to the function's execution), regardless of whether or not its result will be used. Programmers should consult their programming language specifications or test the ternary operator to determine whether or not the language will evaluate both expressions in this way. If it does, and this is not the desired behaviour, then an if-then-else statement should be used.
Nino hat geschrieben:Die numerischew Version lässt sich noch etwas vereinfachen, indem man auf das "Not" verzichtet, und da du in der String-Version für das Trennzeichen eine Variable benutzt, muss es natürlich überall als Variable auftauchen.
Danke für die Hinweise. Ich habe sie im ersten Post übernommen.

Re: Inline-If

Verfasst: 08.03.2016 08:34
von mhs
Nino hat geschrieben:
mhs hat geschrieben:Im einem anderen Thread (http://purebasic.fr/german/viewtopic.ph ... 0&start=10) hatte ich schon mal meine Variante gepostet. Total simpel, dafür nicht komplett Inline, weil die Result Variable mit als Paramter übergeben werden muss... dafür ohne Performanceverlust, doppelter Ausführung der Expression... ist ja schließlich nur ein simples If : Else :lol:
Ich finde, für diese Variante spricht durchaus einiges.
Allerdings funktioniert einer meiner Lieblingsanwendungsfälle nur mit der anderen Variante, die sich wie eine Funktion aufrufen lässt:

Code: Alles auswählen

selected = 3
StatusBarText(0, 0, Str(selected) + " Datei" + IifS(selected <> 1, "en", "") + " ausgewählt.")
Ja, das geht natürlich nicht, deswegen hatte ich es auch "nicht komplett inline" genannt. In solchen Fällen arbeite ich mit einer zusätzlichen Variable. Mir persönlich ist wichtig, dass das If kurz und kompakt in einer Zeile steht, ohne die Ausführungszeit zu verschlechtern oder dass ich mir Gedanken zur doppelten Ausführung von Funktionen, etc machen muss.

Re: Inline-If

Verfasst: 26.05.2016 13:12
von Sicro
Ich werde beide Varianten ins CodeArchiv hinzufügen:
  • Inline-If: z_Miscellaneous/Inline-If.pbi
  • If-Set: z_Miscellaneous/If-Set.pbi

Re: Inline-If

Verfasst: 28.06.2016 14:18
von DarkSoul
Die If-Politik finde ich schon immer in PB etwas misslungen.

Andere Sprache:
if (a > 255) a = 255;
b = (a = 10 ? 5 : c);
In PB fürchterlich sperrig:

Code: Alles auswählen

If a > 255
  a = 255
EndIf
If a = 10
  b = 5
Else 
  b = c 
EndIf
Das Aufreihen von Codezeilen mit : finde ich persönlich auch unschön.

In QBASIC gab es wenigstens noch:

Code: Alles auswählen

IF a > 255 THEN a = 255
Könnte PB ja genauso von Haus aus so machen.

Oder sowas:
b = If a = 0 Then 1 Else 2

Re: Inline-If

Verfasst: 02.02.2018 00:34
von Taz
STARGÅTE hat geschrieben:Ist nicht böse gemeint, aber wie ich im englischen Forum schon schrieb, halte ich nichts von diesen Inline-If Sachen (zumindest nicht in diesem selbstgemachten Zustand).
Speziell geht es um die Problematik, dass beide Zustände (True und False) immer ausgeführt werden, was in diesem Fall z.B. zu Problemen führt:
.....
.....
Darum hier meine Bitte, doch bitte lieber auf eine echte Implementierung zu warten, statt "unechte" Tricks zu posten.
Fast 2 Jahre sind nun vergangen... wird es überhaubt eine Implementierung geben? :(
ternary operator, ich vermisse ihn....

Code: Alles auswählen

result = a > b ? x : y