**Updated** to handle `$` showing from using module variable.

Add `TrackedSymbols :> {c}` and add `Module`

 ClearAll[x,y,c];
 y[x_,c_]:=-x^2+c
 
 Manipulate[
 Module[{ymax,x},
 ymax=FindMaximum[{y[x,c],-1<=x<=1},x];
 Grid[
 {
 {str[ymax]},
 {Plot[y[x,c],{x,-1,1}]}
 }
 ]
 ]
 ,
 {c,-0.5,0.5},
 TrackedSymbols:>{c}
 ]

 (*this function to handle $ in local variable names *)
 str[expr_]:=Module[{},
 StringReplace[ToString[expr,
 FormatType->TraditionalForm],
 c:LetterCharacter~~"$"~~DigitCharacter..:>c]];

Now

![Mathematica graphics](https://i.sstatic.net/6XLUS.png)

Manipulate by default will track all symbols that shows inside it. So when you typed `ymax`, frontend tracked this symbols and Manipulate went and re-evaulated its expression again, and that is why you got `0.5`.

As a rule of thumb, I always use `TrackedSymbols`. This keep things safe. Also use a `Module` inside `Manipulate` to add internal context. Like this:


So rules of thumbs 

1. Use Module inside Manipulate to hide any non-control variables used inside Manipulate. (in your example, these would be `x` and `ymax`.

2. Use `TrackedSymbols` to explicitly list the symbols being tracked. In your case `c`.

This should eliminate most of the problems.

ps. the `$` showing up attached to symbols, when printing/displaying expressions from inside module is common in Mathematica. See [print-expressions-using-local-variables-in-module-without-dollar-sign-is-that-p][1]


 [1]: https://mathematica.stackexchange.com/questions/137036/print-expressions-using-local-variables-in-module-without-dollar-sign-is-that-p