Überarbeitung der Syntax von Duffs Gerät - Ist das legale C / C ++?

8

Erst letzte Nacht bin ich zum ersten Mal auf das seltsame Duff-Gerät gestoßen. Ich habe etwas darüber gelesen, und ich glaube nicht, dass es so abschreckend ist, es zu verstehen. Was mich interessiert, ist die seltsame Syntax (aus Wikipedia):

%Vor%

Ich habe die C ++ - Standarddefinition einer switch-Anweisung (lass es mich wissen, wenn das veraltet ist, ich bin nicht mit Open-Std.org vertraut). Soweit ich das verstehen kann, sind Case-Statements nur vereinfachte Sprunganweisungen zur Verwendung durch die switch-Anweisung.

Der Schalter selbst ignoriert das geschachtelte Do-while vollständig und die Schleife ignoriert die case-Anweisungen. Da der Schalter innerhalb der Schleife springt, wird die Schleife ausgeführt. Der Schalter ist da, um den Rest abzudecken (aus der Division durch 8), und die Schleife behandelt den Teil, der gleichmäßig teilbar ist. Das macht alles Sinn.

Meine Frage ist dann, warum die peinliche Syntax? Mir fällt auf, dass die Schleife so geschrieben werden könnte, dass alle Case-Anweisungen darin enthalten sind, ja? Ich sehe nichts in der Norm, die dieses Verhalten verbietet, und es korrekt unter GCC 4.7 kompiliert, so gilt das Folgende als legal?

%Vor%

Das macht die Absicht des Codes für mich viel klarer. Danke für jedes Feedback. ;)

Bearbeiten: Wie unten erwähnt, wurde der ursprüngliche Code für C geschrieben und enthielt implizites int für die Variablen count und n . Seit ich C ++ markiert habe, habe ich das geändert.

Bearbeiten 2: Modifizierte den überarbeiteten Beispielcode, um ungültige Zählwerte zu berücksichtigen.

    
monkey_05_06 14.01.2013, 22:01
quelle

3 Antworten

8

Mit Blick auf den C ++ 11-Standard wäre der Teil des Codes, über den Sie nachfragen, erlaubt. Hast du es versucht?

Die Regel, die ich sehe, ist:

  

Hinweis: Normalerweise ist die Subanweisung, die das Subjekt eines Switches ist, zusammengesetzt, und die Label case und default erscheinen auf den Anweisungen der obersten Ebene in der (zusammengesetzten) Subanweisung, aber Dies ist nicht erforderlich.

Tatsächlich bedeutet dies, dass Sie die Klammern um den do - while loswerden und

schreiben könnten %Vor%

Diese Zeile ist jedoch NICHT gültig C ++:

%Vor%

C ++ erlaubt nicht default-int, der Typ einer Variablen muss angegeben oder abgeleitet werden.

Ach ja, fixiere die Anzahl der Wiederholungen, ohne die Formatierung zu unterbrechen:

%Vor%     
Ben Voigt 14.01.2013, 22:11
quelle
1

Der Code ist sicherlich legal: Es gibt keinerlei Anforderungen an Blöcke und / oder Schleifen. Es ist jedoch zu beachten, dass count == 0 von der obigen Schleife nicht richtig behandelt wird. Es wird jedoch richtig von diesem behandelt:

%Vor%

Wenn Sie das Label case 0 in die Schleife einfügen, werden die verschachtelten Anweisungen ebenfalls falsch ausgeführt. Obwohl ich gesehen habe, dass Duffs Gerät immer eine do-while -Schleife verwendet, scheint es, dass der obige Code natürlicher ist, um mit der Randbedingung umzugehen.

    
Dietmar Kühl 14.01.2013 22:30
quelle
1

Ja, es ist legal. Die Beschriftungen einer switch -Anweisung werden normalerweise auf derselben Ebene wie die switch -Anweisung geschrieben. Es ist jedoch zulässig, sie in zusammengesetzte Anweisungen zu schreiben, z. in der Mitte einer Schleife.

BEARBEITEN : Es ist nicht erforderlich, dass der Hauptteil der switch-Anweisung mit einem Label beginnt, jeder Code ist legal. Es gibt jedoch keinen Weg aus der switch-Anweisung selbst. Wenn es sich nicht um eine Schleife oder ein einfaches Label handelt, ist der Code nicht erreichbar.

Eine weitere interessante Sache mit der Anweisung swtich ist, dass die geschweiften Klammern optional sind. In diesem Fall ist jedoch nur ein Label erlaubt:

%Vor%     
Lindydancer 14.01.2013 22:12
quelle