Often a quick solution to a problem, can be solved by hacking the WordPress core, that is changing the code that is WordPress itself.
This is a very dangerous road to take! Don’t do it, ever!
You can always change how WordPress works, by using plugins. This can sometimes be rather tiresome and difficult, but the extra work always outweighs the problems you get by changing the WordPress core itself.
Some would say that there can be situations where hacking the core is the only solution, but if you are here asking questions, you are definitely not in that situation.
This question, is meant to be an introduction to a collective work of why you should never hack the WordPress core, that we can use as a reference. If you have something to add, feel free to add it as a question.
The best reason not to hack core is that whatever you are doing should be reworked as a patch for core instead!
Obviously ALL of your code would not make a good patch at all, or at least it rarely would. Instead you need to figure out what hook (action or filter) is missing in core that would let you do whatever it is you need to do without hacking core. We don’t need to hack core when there are adequate filters/actions, so finding what the missing hook is will always remove the need to hack core.
This can often require some tough problem-solving and tricky legwork, but more often then not what happens is you discover that there already is a hook to solve your problem, so you don’t have to hack core!
In the rare scenario where there really is no hook you just need to post on trac explaining why your hook needs to exist. If you get your new hook committed then you have a temporary 1-line hack to core that won’t need to be worried about the next time you update.
Even if your suck at getting stuff done in the Core trac (it takes some convincing to get stuff committed), you have at least boiled your core hack to the minimum possible: 1 line of code for your action/filter. When you update WP you’ve now replaced all the code you shoved into core with one line that needs to be updated, and your plugin can stay the same!