<evangelisation>
C is, in principle, assembly language, therefore it is almost as fast
as real assembly, but is still easy to write and quite portable. It
is great for programming things like kernels, libraries that need high
speed operation (like MPEG decoding/encoding), generally most of things
that need to be real time. However it is very easy to cut your finger
with such a sharp knife. Typesystem provided by C isn't very powerful,
most of people familiar with functional programming, would say that
typesystem of C is no more then a toy. Similarly C doesn't provide much
support for memory management, exceptions, functional and objective
programming. Of course, lack of restriction from language about how
you organize your memory management, objects, and error recovery, can
be advantage, especially with respect to operating system programming
and so on. However in most cases, writing xmalloc()
100th time,
is annoying. I think that's the main reason why Java is so popular - it
takes burden of thinking at the very low level away from the programmer,
and also it is much harder to make a mistake (at the cost of more typing,
and performance regression).
</evangelisation>.