仕様書を持っていないんだけど、
! 演算子は true/false を受け取るものなの?
それとも単に条件式と同様に
!x は x が 0 ならば 0 以外となり x が 0 以外ならば 0 となる
などと定義されているだけなの?

strcmp の話は !strcmp(s1,s2) と書くことが意味的にどうかって話なので
結局は ! 演算子に渡すべき値が true/false の代用としての int なのか
単なる int なのかっていう話だと思うんだけど。