Il faut comprendre ça d'un point de vue compilateur.
Quand ton programme traitera cette expression.
if(e1==e2==e3)
La réelle expression ne sera pas e1 == e2 == e3, mais plutôt de ce style.
(e3 == (e2 == e1))
(ou un truc du style)
Donc il va traiter e2 == e1, qui va retourner un boolean.
Le problème de compilation va ce poser dès maintenant, en effet, si on pense ça d'un point de vue compilo, tu fais une opération entre un integer et un boolean.
Par exemple, pour e1 = 0, e2 = 1, e3 = 2.
e1 == e2 == e3
(e3 == (e2 == e1))
(2 == (1 == 0))
(2 == false) // problème de compilation