You are a victim of operator precedence. The comparison operator
(and the other comparison operators) have higher precedence than assignment. That means that
false !== $row = mysql_fetch_assoc($result)
strictly parses as
(false !== $row) = mysql_fetch_assoc($result)
which probably isn't what you mean.
if (!$row = mysql_fetch_assoc($result))
behaves as you would expect, even though it is a "violation" of the precedence list.
Fun, isn't it?