laut C Definition, wird
A & B == C
als
A & ( B == C )
angesehen und nicht, wie man vermuten könnte, als
( A & B ) == C
Daher: zusätzliche Klammern einfügen
1 | #define IS_PQ_TQUOT ((RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1)) == 0x00)
|
> Nur Warum nicht ?
Operator Precedence Table studieren
http://www.difranco.net/cop2220/op-prec.htm
Je weiter oben ein Operator in dieser Tabelle steht, desto stärker
bindet er. Da sind ein paar böse Fallen eingebaut. Eine davon hast du
jetzt gerade in Aktion bemerkt.
1 | if IS_PQ_TQUOT val = RAM.iTempTop; else
|
Schreib das nicht so. Sieht für jeden C Kenner seltsam aus und man denkt
sofort, da passiert irgendetwas Magisches
1 | if ( IS_PQ_TQUOT ) val = RAM.iTempTop; else
|
Auch das else da hinten ist leicht zu übersehen. Bau dir nicht selbst
Lesefallen in den Code ein, wenn es nicht sein muss
1 | if ( IS_PQ_TQUOT ) val = RAM.iTempTop;
|
2 | else if ( IS_PQ_TSNGL ) val = RAM.iTempQuot;
|
3 | else if ( IS_PQ_ATTENUATION ) val = RAM.iAttenuation;
|