Also, for anybody doing modern C work, I strongly recommend both Hanson's _C Interfaces and Implementations_ and Ierusalimschy's _Programming in Lua_, 2nd ed. The former nails writing good C libraries, and the latter covers one particular library that provides a portable, C-friendly, mature, efficient (http://luajit.org/), ready-made scripting language that is a cleaner incarnation of JavaScript's "good parts".
Also, both are good reading. The former is a shining example of literate programming, and the latter is IMHO one of the best programming texts that wasn't co-written by Brian Kernighan. :)
I work on a compiler, I agree, there's some weird behaviour that's possible, but a lot of the things he's described are implementation defined. There are general conventions, but things like shifting values more than double their size is implementation defined.
If you really want to get a good handle on C, there's nothing like reading the spec.
Also, for anybody doing modern C work, I strongly recommend both Hanson's _C Interfaces and Implementations_ and Ierusalimschy's _Programming in Lua_, 2nd ed. The former nails writing good C libraries, and the latter covers one particular library that provides a portable, C-friendly, mature, efficient (http://luajit.org/), ready-made scripting language that is a cleaner incarnation of JavaScript's "good parts".
Also, both are good reading. The former is a shining example of literate programming, and the latter is IMHO one of the best programming texts that wasn't co-written by Brian Kernighan. :)