Die höhere Priorität des Vergleichsoperators bewirkt, daß der Ausdruck
derart ausgewertet wird, als ob der Teil
1 | TCP_PORT_TABLE[port_index].port!=(htons(tcp->TCP_DestPort))
|
extra in Klammern stehen würde. Der ANSI C Standard besagt:
1 | The && operator shall yield 1 if both of its operands compare
|
2 | unequal to 0, otherwise it yields 0. The result has type int.
|
und
1 | Unlike the bitwise binary & operator, the && operator guarantees
|
2 | left-to-right evaluation; there is a sequence point after the
|
3 | evaluation of the first operand. If the first operand compares equal
|
4 | to 0, the second operand is not evaluated.
|
Der Vergleichsoperator liefert, ebenso wie auch die logischen
Operatoren, einen Integer-Wert von 1 oder 0 zurück. Wenn nun bereits der
erste Ausdruck des logischen UND Vergleichs gleich Null ist, wird der
zweite Teil gar nicht mehr ausgewertet, da als Ergebnis nur Null
herauskommen kann.
Es wird also zuerst ausgewertet, ob TCP_PORT_TABLE[port_index].port
ungleich Null ist. Nur wenn das der Fall ist, wird
TCP_PORT_TABLE[port_index].port mit (htons(tcp->TCP_DestPort))
verglichen. Und nur wenn sich die beiden Werte unterscheiden, kommt als
Ergebnis des Vergleichs eine 1 heraus und ergibt logisch-und-verknüpft
mit dem ersten Teil als Ergebnis die 1 für den Gesamtausdruck.
Die While-Schleife läuft demnach so lange, wie in der Tabelle an der
Stelle [port_index] weder eine Null noch der gesuchte Wert steht.