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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren