@ PSkociks Antwort ist in Ordnung, aber ich addiere meine zwei Cent. Unsicher, ob ich dies als Kommentar oder als Antwort tun soll; Wählen Sie Letzteres, weil IMHO andere sehenswert sind, während Kommentare häufig unsichtbar sind.
Ich benutze nicht nur gelegentlich
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Aber ich mache es auch gelegentlich
if( 1
&& cond1
&& cond2
...
&& condN
) {
oder
if( 0
|| cond1
|| cond2
...
|| condN
) {
für komplizierte Bedingungen. Aus den gleichen Gründen - einfacher zu bearbeiten, #ifdef usw.
Im Übrigen werde ich in Perl tun
@array = (
elem1,
elem2,
...
elem1,
) {
- Beachten Sie das Komma am Ende der Liste. Ich vergesse, ob Kommas Trennzeichen oder Trennzeichen in C- und C ++ - Listen sind. IMHO ist dies eine Sache, die wir gelernt haben: [ Sind nachgestellte Kommas in Perl eine schlechte Praxis? Kommas] sind eine gute Sache. Wie bei jeder neuen Notation dauert es eine Weile, bis man sich daran gewöhnt hat.
Ich vergleiche den if(0)
Code mit lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
was, Sie haben es erraten, ich kann einrücken als
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Ich habe manchmal versucht mir vorzustellen, wie eine besser lesbare Syntax dafür aussehen könnte.
Vielleicht
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
inspiriert von Dikstras [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if‹[Guarded Command Language].
Diese Syntax impliziert jedoch, dass die Bedingungen parallel ausgewertet werden, während if...else-if
die sequentielle und priorisierte Bewertung der Bedingungen impliziert wird.
Ich habe so etwas angefangen, als ich Programme geschrieben habe, die andere Programme generiert haben, wo es besonders praktisch ist.
Während wir gerade dabei sind, RTL mit Intels alter iHDL zu schreiben, habe ich Sachen wie codiert
IF 0 THEN /*nothing*/
**FORC i FROM 1 TO 10 DOC**
ELSE IF signal%i% THEN
// stuff to do if signal%i% is active
**ENDC**
ELSE
// nothing matched
ENDIF
Dabei FORC..DOC..ENDC
handelt es sich um ein Makro-Präprozessor-Schleifenkonstrukt, das auf erweitert wird
IF 0 THEN /*nothing*/
ELSE IF signal1 THEN
// stuff to do if signal1 is active
ELSE IF signal2 THEN
// stuff to do if signal2 is active
...
ELSE IF signal100 THEN
// stuff to do if signal100 is active
ELSE
// nothing matched
ENDIF
Dies war eine nicht zwingende Einzelzuweisung, daher war das Festlegen einer Statusvariablen nicht zulässig, wenn Sie beispielsweise das erste gesetzte Bit suchen mussten.
IF 0 THEN /*nothing*/
ELSE IF signal1 THEN
found := 1
ELSE IF signal2 THEN
found := 2
...
ELSE IF signal100 THEN
found := 100
ELSE
// nothing matched
ENDIF
Wenn ich daran denke, war dies vielleicht der erste Ort, an dem ich auf solche Konstrukte gestoßen bin.
Übrigens gelten die Einwände, die einige gegen den if (0) -Stil hatten - dass die else-if-Bedingungen sequentiell abhängig sind und nicht willkürlich neu angeordnet werden können - nicht für die AND- und OR- und XOR-Logik in RTL - sondern für Short- Schaltung && und ||.