Go for ASM if you need low level embedded non-portable programming.
Go for C if you need "somewhat" portable code and want to have control _how_ your program actually does things. C is generally good for system-level programming, I say it's a good compromise between assembly and high-level languages. If you turn off all compiler optimizations, you can write all the functions, variables, structures (almost) exactly the same way they'll appear in the final executable.
Go for C++ if you need higher-level portable programming and OOP style. Some people say it's "an extension" to the C language, they also say it's "not really a good way to extend C". C++ could indeed have better design and syntax specifications, but anyway - it's the most common language today (imho) and that's what counts. You can use C-like variables and structures in C++ to some degree. With C++ comes great responsibility for code concept, you can do MUCH more things in MUCH more ways than in C, which can result in a total code crazyness - don't forcefully use everything C++ offers just because it compiles fine.
Go for C# if you .. well, I can't really say. Many people warn about Microsoft's claims on intellectual property in relation to mono. On the other hand - it *might* be a good language for Windows-only apps, I haven't really tested that. Don't expect to get the same portability as with C++.
Go for Python/Java/Perl/whatever if you want ultra-portable code and true high-level syntax. Many people use Python with PyGTK to make nice GUI apps without having to fight the low level issues. Some guys here might say "naah, those high-levels are WAAAY too slower than C++". Yes, they're right. But the slowdown isn't really noticeable in common applications. It's even less noticeable when it comes to PyGTK/PyQt as the same graphic lib gets used anyway.