Switch / Case Anweisung mit Bedingung

Moderator Persönliche Seite #709715
Lesenswert?
• ▲
▼
Wobei ein guter Compiler aus beiden Formen dasselbe machen sollte, d.h.
er müsste merken, dass die letzte Bedingung nur noch wahr sein kann.

Witzigerweise schnallt es der GCC hier nicht:
1
extern void a(void);
2
extern void b(void);
3
extern void c(void);
4

5
#include <avr/io.h>
6

7
void
8
evaluate(void)
9
{
10
        int8_t diff;
11

12
        diff = OCR0A - OCR0B;
13

14
        if (diff < 0)
15
                a();
16
        else if (diff == 0)
17
                b();
18
        else if (diff > 0)
19
                c();
20
}

Stellt man den Code geringfügig um, dann klappt's:
1
extern void a(void);
2
extern void b(void);
3
extern void c(void);
4

5
#include <avr/io.h>
6

7
void
8
evaluate(void)
9
{
10
        int8_t diff;
11

12
        diff = OCR0A - OCR0B;
13

14
        if (diff < 0)
15
                a();
16
        else if (diff > 0)
17
                c();
18
        else if (diff == 0)
19
                b();
20
}
#709717
Lesenswert?
• ▲
▼
@  Jörg Wunsch (dl8dtl)

>Wobei ein guter Compiler aus beiden Formen dasselbe machen sollte, d.h.
>er müsste merken, dass die letzte Bedingung nur noch wahr sein kann.

Sollte ein halbwegs zurechnungsfähiger Programmierer das nicht auch 
direkt so hinschreiben können? Soviel Kompetenz in Mengenlehre sollte er 
doch haben, oder?

MFG
Falk
Moderator Persönliche Seite #709731
Lesenswert?
• ▲
▼
Falk Brunner wrote:

> Sollte ein halbwegs zurechnungsfähiger Programmierer das nicht auch
> direkt so hinschreiben können?

Der Punkt bei Compileroptimierungen ist ja, dass der Programmierer
den Code in gut lesbarer Form abliefern sollte, ohne dass er sich
darum kümmern muss, ob da etwas überspezifiziert ist.  Solange da
nur a(), b() und c() gerufen werden, ist die Sache ja auch so
übersichtlich, aber was, wenn da jeweils eine halbe Seite dazwischen
ist?

Die Bedingung in der letzten if-Anweisung ist dann gewissermaßen ein
Kommentar, der die Lesbarkeit verbessert.  Wenn die Compileroptimierung
das nicht schnallt, muss man sich mit dem Weglassen der Bedingung und
einem echten Kommentar behelfen, was a) erfordert, dass man sich den
generierten Code erst noch anguckt und b) ,,unsymmetrisch'' aussieht.
#709745
Lesenswert?
• ▲
▼
Ich würds ja so schreiben:
1
extern void a(void);
2
extern void b(void);
3
extern void c(void);
4

5
#include <avr/io.h>
6

7
void
8
evaluate(void)
9
{
10
        int8_t diff;
11

12
        diff = OCR0A - OCR0B;
13

14
        if( diff ){
15
          if( diff & 1<<7 ){
16
            a();    // negativ
17
          }else{
18
            c();    // positiv
19
          }
20
        }else{
21
          b();      // 0
22
        }
23
}


Peter
Gast #709803
Lesenswert?
• ▲
▼
Könnte mir irgendjemand den Aufbau besser erklären? Ich hab zwei 
Aufgaben dazu:
1. Über ein JS-Programm soll eine Notenziffer eingegeben und die 
entsprechende ausgeschriebene Note auf dem Bildschirm erscheinen.

2. Erstelle einen kleinen Taschenrechner über den man zwei Zahlen und 
ein Operatorzeichen (*, /, +, -, ^2) eingibt. Das zum Operator passende 
Ergebnis soll dann auf dem Bildschirm ausgegeben werden.
#709822
Lesenswert?
• ▲
▼
Gast wrote:
> Könnte mir irgendjemand den Aufbau besser erklären? Ich hab zwei
> Aufgaben dazu:
> 1. Über ein JS-Programm soll eine Notenziffer eingegeben und die
> entsprechende ausgeschriebene Note auf dem Bildschirm erscheinen.
>
> 2. Erstelle einen kleinen Taschenrechner über den man zwei Zahlen und
> ein Operatorzeichen (*, /, +, -, ^2) eingibt. Das zum Operator passende
> Ergebnis soll dann auf dem Bildschirm ausgegeben werden.

Es gibt unzählige Möglichkeiten wie man die beiden Aufgabenstellungen
lösen kann. Nimm die die du hinkriegst und dein Lehrer wird das
akzeptieren.

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]
  • [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.