Entscheidungsoperation IF/else oder ?

#3391805
Lesenswert?
• ▲
▼
Das "?" ist kürzer!

Nachteil zu if/else-Konstrukten:

if()...
else if()...
else if()...
else if()...
-> so viele Fälle auf einer Ebene wie du brauchst

... <= (Bedingung)? Fall 1 (Bed. erfüllt) : Fall 2 (Bed. nicht erfüllt);
oder
... <= (Bedingung)? Fall 1 (Bed. erfüllt) : ((Bedingung 2)? Fall 2.1 : 
(Bedingung 3) Fall 3.1 ...;
-> nur 2 Fälle pro Entscheidungsebene, mehrere Fälle nur über 
Verschachtlung möglich.

Zusammenfassung:
? bei einfachen Ja/Nein-Abfragen praktischer
Moderator (Firma: Titel) Persönliche Seite #3392041
Lesenswert?
• ▲
▼
Daniel T. schrieb:
> Gibt es irgend einen Vorteils diese "?"?
In der Kürze liegt die Würze...

> Ich persönlich finde solchen Code nämlich sehr unschön.
Über Schönheit darf gestritten werden. Der ?-Operator gefällt mir schon 
in C sehr gut. In VHDL vermisse ich so was knackiges und kompaktes...

EDIT:
Hurra, ich hab ihn wieder gefunden, den 
Beitrag "Re: VHDL: 4Bit Hex -> ASCII" mit dem 
Fragezeichenoperator...  ;-)
Moderator #3392781
Lesenswert?
• ▲
▼
Trundle Trollkönig schrieb:
> -> nur 2 Fälle pro Entscheidungsebene, mehrere Fälle nur über
> Verschachtlung möglich.

Wenn du das als If-Else-Kette hinschreibst, ist diese ebenfalls
verschachtelt. Normalerweise würde sie so aussehen:
1
  if(Bedingung1) {
2
    Fall1;
3
  }
4
  else {
5
    if(Bedingung2) {
6
      Fall2;
7
    }
8
    else {
9
      if(Bedingung3) {
10
        Fall3;
11
      }
12
      else {
13
        if(Bedingung4) {
14
          Fall4;
15
        }
16
        else {
17
          Fall5;
18
        }
19
      }
20
    }
21
  }

Oft wird diese Verschachtelung etwas kaschiert, indem man überflüssige
Klammen und die Einrückung weglässt:
1
if (Bedingung1) Fall1;
2
else if (Bedingung2) Fall2;
3
else if (Bedingung3) Fall3;
4
else if (Bedingung4) Fall4;
5
else Fall5;

Entsprechendes kann man aber beim ?:-Operator ebenfalls machen:
1
Bedingung1 ? Fall1 :
2
Bedingung2 ? Fall2 : 
3
Bedingung3 ? Fall3 :
4
Bedingung4 ? Fall4 :
5
             Fall5 ;

Das sieht dann sogar noch etwas übersichtlicher aus als das Beispiel
davor.
#3393100
Lesenswert?
• ▲
▼
ich kann gerade nicht 100 prozentige Bestätigen ob
1
if(Bedingung1) {
2
    Fall1;
3
  }
4
  else {
5
    if(Bedingung2) {
6
      Fall2;
7
    }
8
    else {
9
      if(Bedingung3) {
10
        Fall3;
11
      }
12
      else {
13
        if(Bedingung4) {
14
          Fall4;
15
        }
16
        else {
17
          Fall5;
18
        }
19
      }
20
    }
21
  }

und
1
if (Bedingung1) Fall1;
2
else if (Bedingung2) Fall2;
3
else if (Bedingung3) Fall3;
4
else if (Bedingung4) Fall4;
5
else Fall5;

in verilog wirklich das gleiche ist???

beim ersten gibts es klar ne Priorisierung der Abfragen (ich will es 
jetzt nicht Sequenz nennen weil ja alles noch in einem Takt passieren 
kann).

und ich weiß nicht ob das bei Fall 2 ebenso ist, speziell wenn man 
Bedingungen betrachtet wo Bedinung 2 eine Untermenge von Bedingung 1 
oder so ist.

ich will nicht behaupten, das man mit beiden konstrukten nicht gleiches 
Verhalten herstellen kann, aber ob das immer so ist ohne nochmal was 
umzustellen keine ahnung...
Persönliche Seite #3393267
Lesenswert?
• ▲
▼
Trundle Trollkönig schrieb:
> ich kann gerade nicht 100 prozentige Bestätigen ob
> [beides] in verilog wirklich das gleiche ist???

Mal abgesehen, dass die entsprechende Verilog Syntax im ersten Fall 
natürlich etwas anders aussieht ist es das gleiche.

> beim ersten gibts es klar ne Priorisierung der Abfragen
> und ich weiß nicht ob das bei Fall 2 ebenso ist, speziell wenn man
> Bedingungen betrachtet wo Bedinung 2 eine Untermenge von Bedingung 1
> oder so ist.

Wenn die Syntese beweisen kann, dass zwei Fälle mutually exclusive 
sind, kann sie damit machen was sie will. Wenn nicht, muss priorisiert 
werden. Der Simulation ist das alles sowieso egal.

In SystemVerilog kann man mit unique if auch der Simulation bekannt 
geben, dass man keinen Prioritätsencoder haben möchte. Dann wird zur 
Laufzeit überprüft ob die Exclusivität der Fälle gegeben ist.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.