I've come to the conclusion C is evil... The ROOT of all computer evil. Programs were small and tight when everyone had to code in assembler for space and speed purposes. Now we have our gigs of RAM and terabytes of drive space... Our machines are faster, but our programs aren't... They are bloated and slow.
First, ask yourself what you intend to write, then choose a language.
The nice thing about C compared to ASM is that it teaches you not to think too much about the hardware and more about what you are doing. Programming languages are really supposed to do that. I think things really began to bloat out of control when OOP showed up, and it became "trendy." It has its uses, but most of the time, people use it when they shouldn't.
Bloat is caused by bad technique or using tools too complex to suit the job. Using a 50+MB package like Perl, or forcing an app to behave like, or actually use, stateless web tools comes to mind. Don't spend time with ASM unless you intend to make 4K demos. ;-)
Personally, I think C++ should be replaced with a new interpreted language but without all the Virtual Machine toolkit crap like your typical 100+ MB Java installation. C should be used only for low-level stuff. ASM should be outright banned for anything other than games or architecture toolkits (like endian conversion).
As for books, I'm afraid all I know about programming I picked up myself. I got into refactoring other people's projects, so I learned most lessons the hard way. Nothing teaches you what NOT to do than to pick up someone else's rotten code. :-)
If technique is your question, rather than style or syntax, I recommend "The Art of UNIX Programming" by Eric S. Raymond.
An online version is here. It's easy to follow for newbies.
Can you imagine the look on the face of a VB programmer if you told them the had to learn ASM and the architecture of the hardware first?
You know,
all BASIC spinoffs look wretched to me, now. I started on AMOS and Blitz basic, and I find it remarkable that these languages had no sense of modular programming and basic function calls. AMOS was written in assembler, after all. I have no idea why having integrated BASIC was so damned important for most early 8-bit systems, and why they still teach kids how to program in BASIC in high school.