a==b==c will be accomplished as either (a==b)==c or a==(b==c). I don't know which, and I don't care. You shouldn't care either. It is much less work to use parentheses than it is to accurately remember such arcana.
A boolean expression is either true or false. In C, true is represented by the integer value 1 and false is represented by the integer value 0.
-
a==b==c
-
(a==b)==c // or it might be a==(b==c)
-
(10==10)==10 // replace variables with their values
-
1==10 // because parenthesized expression is true
-
0 // because final expression is false
If your intent is to print "hi" if (a==b and a==c) then that's what you have to say in your code:
Aside to whodgson: those string arguments to printf are by definition the format strings. They just don't happen to contain any conversion specifiers.