I don't really read code unless I've run into a snarl of conditional logic. Then it feels like I'm kind of sounding out the logic expressions while cursing under my breath about some asshat that doesn't know what state-machines are for.
What I am doing is watching for declarations, assignments, usages, language structures and flow that eventually lead me to see what a chunk of code is doing. This happens most often when I'm trying to understand what a low-level function is doing. Higher-level stuff is usually named well enough that it is easy to see flow like reading dialog in a screen play or novel. Poor formatting slows this down to an annoying degree.
If I had to give it a concise description... It is like contemplating a painting, or a photograph, until all of it's elements make sense.
One exception is when reading assembly language. I'm keeping a running tally in my head of the key variables and operations as I scan down the list of operations in a function. I'm watching for common idioms and macros, etc. Again this eventually results in abstracting all of it away and thinking of the function. This feels to me kind of like sounding out a new word.
[I was programming in BASIC at 11, and transitioned into 6502 and Z-80 assembly pretty quickly. BASIC was just too slow for what I was interested in.
I guess I was in my mid 20's before I did anything professionally with C/C++, or anything other than assembler languages, for that matter.]