>>499
演算子には優先順位というものがあって、
==は=よりも優先順位が高い
for (; ch=fgetc(fp) != '@'; total++)
は
for (; ch= (fgetc(fp) != '@'); total++)
と解釈される。
代入演算子(=)は右辺の値を返すので条件としては正常

演算子の優先順位を全て覚える必要は無いが、
代入演算子はほぼ全ての演算子より優先順位が低い、ということくらいは覚えておいた方がいい