This is explained in the tcsh man page (I suspect you're using tcsh, not csh); see the third quoted paragraph.
The shell maintains a list of aliases which can be set, unset and
printed by the alias and unalias commands. After a command line
is parsed into simple commands (see Commands) the first word of
each command, left-to-right, is checked to see if it has an alias. If
so, the first word is replaced by the alias. If the alias contains a
history reference, it undergoes History substitution (q.v.) as
though the original command were the previous input line. If the alias
does not contain a history reference, the argument list is left
Thus if the alias for `ls' were `ls -l' the command `ls /usr' would
become `ls -l /usr', the argument list here being undisturbed.
If the alias for `lookup' were `grep !^ /etc/passwd' then `lookup
bill' would become `grep bill /etc/passwd'. Aliases can be used to
introduce parser metasyntax. For example, `alias print 'pr !* |
lpr'' defines a ``command'' (`print') which pr(1)s its arguments to
the line printer.
Alias substitution is repeated until the first word of the command has
no alias. If an alias substitution does not change the first word (as
in the previous example) it is flagged to prevent a loop. Other loops
are detected and cause an error.
A good workaround is to precede a command with a
\ character to inhibit alias expansion:
alias df 'printf "\n"; \df -hP | column -t'