Wenn das Programm hier ....
1 |
|
2 | else if( (x >= 36) && (x < 72))
|
3 | {
|
4 | PORTA = 0x03;
|
5 | }
|
... jemals zur Abfrage kommt, dann steht bereits fest, dass x
großer/gleich 36 sein MUSS. Denn wenn x kleiner wäre, dann würde das
Programm gar nicht bis hier her kommen, sondern wegen
1 | if( (x >= 0) && (x < 36))
|
2 | {
|
3 | PORTA = 0x01;
|
4 | }
|
5 |
|
6 | else if( (x >= 36) && (x < 72))
|
7 | {
|
8 | PORTA = 0x03;
|
9 | }
|
10 | ...
|
bereits im ersten if hängen bleiben. Dann wird aber alles nachfolgende
nach dem else gar nicht mehr betrachtet.
D.h.
* du bürdest deinem µC eine Fleissaufgabe auf, indem du etwas testest,
was gar nicht mehr möglich ist (genauso wie x als unsigned Wert nicht
kleiner als 0 sein KANN).
* schlimmer aber: du baust dir eine potentielle Falle, indem du an 2
Stellen im Programm denselben Zahlenwert hinschreiben musst. Und das ist
ein 'Muss', das der Compiler für dich nicht überwachen kann. D.h. du
hast dir da in den Code etwas eingebaut, was nur darauf angewiesen ist,
das du als Programmierer sorgfältig bist. Und das geht dann eben öfter
schied als einem lieb ist.
So
1 | if( x < 36 )
|
2 | {
|
3 | PORTA = 0x01;
|
4 | }
|
5 |
|
6 | else if( x < 72 )
|
7 | {
|
8 | PORTA = 0x03;
|
9 | }
|
10 |
|
11 | else if( x < 108 )
|
12 | {
|
13 | PORTA = 0x07;
|
14 | }
|
15 |
|
16 | else if( x < 144 )
|
17 | {
|
18 | PORTA = 0x0F;
|
19 | }
|
20 |
|
21 | else if( x < 180 )
|
22 | {
|
23 | PORTA = 0x1F;
|
24 | }
|
25 |
|
26 | else if( x < 216 )
|
27 | {
|
28 | PORTA = 0x3F;
|
29 | }
|
30 |
|
31 | else if( x < 252 )
|
32 | {
|
33 | PORTA = 0x7F;
|
34 | }
|
35 |
|
36 | else if( x < 288 )
|
37 | {
|
38 | PORTB |= (1<<PB2);
|
39 | PORTA = 0x7F;
|
40 | }
|
... ist das haarscharf dieselbe Auswertung. Mit dem einen Unterschied,
dass jede Grenze nur einmal in Form einer Zahl im Programm vorkommt.
D.h. hier kann es dir per Definition nicht passieren, dass die Werte in
2 aufeinanderfolgenden if -Abfragen nicht zusammenpassen.