<p>Here is some simple Perl to count the number of times a value occurs in an array. This runs without any warnings.</p>

<pre><code>use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{$_}++;
}
</code></pre>

<p>When the loop body is changed to</p>

<pre><code>$histogram{$_} = $histogram{$_} + 1;
</code></pre>

<p>Perl warns "Use of uninitialized value in addition".</p>

<p>What is going on under the hood? Why is the value initialized when supplied as an operand to the ++ operator and uninitialized with the + operator?</p>

The + operator evaluates both the form to the left and the form to the right of it, then returns the sum of both.  The hash call evaluation does not see any special context.
The ++ operator has some special magic built in. Quoting from the perlop manpage, regarding the ++ operator:
"undef" is always treated as numeric, and in particular is changed to 0 before incrementing (so that a post-increment of an undef value will return 0 rather than "undef").
edit
: To elaborate on the difference, ++ changes the value in place, while + just takes its arguments as input.  When + sees an undefined value, typically something has gone wrong, but for ++, your hash manipulation example is very typical -- the user wants to treat undef as 0, instead of having to check and initialize everytime.  So it seems that it makes sense to treat these operators this way.