そもそもはこの2つの違いの話だよな。(この結果を代入する先のcのことはとりあえず考えない)
(A) (double)(a+b)/2.0;
(B) (a+b)/2.0;

aとbはint型。(242の後者でaとbはshort型だが、式内での格上げで結局int型として扱われる)
だから(a+b)もA, B共にint型になる。

Aでは、それをdouble型にキャストして、2.0で割っている。Bではキャストせずに2.0で割っている。
2.0は浮動小数点リテラルで、接尾辞は何も付いていないから、double型。

つまりAは「double型の値 / double型の値」、Bは「int型の値 / double型の値」となる。

Aは除算演算子の両辺の型が同じdouble型だから、double型で除算が行われる。
Bは両辺の型が違うが、規格書ではこの場合両辺をdouble型にする事になっている。(規格書を各自見てくれ)
この際にint型の値をdouble型の値に変換する方法は、
int型の値をdouble型の値へキャスト演算子で変換する場合と全く同じである。(〃)

だからAもBも(型、値含め)全く同じ結果になる。