Bad comments tell what the code is doing when that's obvious from the code itself. Good comments explain why, especially when they're fixes for non-obvious bugs. If you spent a lot of time figuring out the solution to a tough problem, you owe the next guy to see your code an explanation.
Not exactly. Sometimes comments describing what the code does are what is needed. For example when commenting assembly language, describing what instructions do from the point of view of the problem solved is really helpful. Another example is when writing some not-that obvious optimization. Of course both are examples of code with no obvious behaviour. Obvious code, I agree, should not be commented. But obvious to one is not nesseccery obvious to other
I don't understand how we can answer why, especially in the code. For example
//what: Adds two numbers
//why: I don't know
The why should be answerd elsewhere. In some design document or in a design choice comment.