S = solve(eqn) solves the equation eqn for the default variable determined by symvar.
and
When performing differentiation, integration, substitution or solving equations, MATLAB uses the variable returned by symvar(s,1) as a default variable. For a symbolic expression or matrix, symvar(s,1) returns the variable closest to x.
and
When sorting the symbolic variables by their proximity to x, symvar uses this algorithm:
The variables are sorted by the first letter in their names. The ordering is x y w z v u ... a X Y W Z V U ... A.
So when you pass in only the expression, solve() will solve for the default variable, which will be the variable closest to "x", and in your case that would be "c". Thus,
solve(a*b+c)
is the same as
solve(a*b+c, c)
which is why you get -a*b as the answer.
When you pass in multiple names, solve() will solve for all of those names simultaneously ("simultaneous equations"), trying to isolate each of the names passed in onto the left hand side and expressed entirely in terms of the remaining constants and variables. It does not solve for each of the variables in turn. But solving simultaneous equations for N variables can only work if you have at least N equations, which is why you get the warning.
If you want to solve for each variable in turn, call solve() multiple times, specifying the variable each time. Automate it if you want to. For example,
expr = a*b+c;
vars = symvars(expr);
clear temp
for v = vars
try
temp.(char(v)) = solve(expr, v);
catch
temp.(char(v)) = 'error';
end
end