There are several views on this that have noted above. Basically, style and comments help with maintainability.
Code is written for programmers (including yourself!), not for the compiler. If we never needed to read the code, just punch it in with a hex pad (like a real programmer!) and be done with it! :-)
But that is almost never the case. Over the lifetime of the code, the compiler may spend a total of a few seconds processing it. But days may be spent by programmers. And those days may increase to weeks if it is hard to read or understand. Effort should be expended to make code self-documenting, but don't rely on it. Ever.
Indentation shows control flow. A bunch of lines with no indentation may have control flow but it means you have to read each line to detect it:
if(someSituation) somethingElse++;
vs.
if(someSituation)
somethingElse++;
The second version jumps out visually. You don't have to read and understand the code to see that a decision was made. Very important when scanning through some code to find something quickly.
Most IDEs and programming editors will allow you to indent a block of code instantly. This is so easy that you should do it just to ensure you don't have a dangling "else" or some other operator-headspace problem. Lack of indentation is very hard to justify.
Comments are also important. If the comments don't match the code, then they are both wrong (I don't remember who first said this, but s/he is dead on!).
I put in a comment block when first laying out the code, then code and debug, and then check the comments again. I may find that I have misunderstood the problem (change the comments) or I may have implemented the wrong thing (change the code). Or I may find that I have reimplemented a library function (temporarily comment it all out in case I need to do something strange after all) and put in the call to the function.
Sometimes you have to use a library function that is badly named. You can say RTFM and move on, or you can put in a summary comment and save the next programmer (perhaps yourself in 6 months) some effort.
// This allocates space for the message queue and initializes
// some OS overhead. All that remains after this is adjusting
// priority and content and then send the message.
prepareMessage(&myMessage);
Further, if you have spent 2 days running down a bug and put in a small change in the code, there is a good chance that the change was not obvious at design time. Else it would have been there in the first place! So a comment is needed to prevent somebody in the future changing it back to the "obvious" implementation.
memset(&myStatus, 0, sizeof(myStatus));
// The size member must be set before getting current values.
// This is used by library function GetCurrentStatus() to infer
// a version of the status structure.
myStatus.length = sizeof(myStatus);
GetCurrentStatus(&myStatus);