it might be that in some programming contexts, you have a data type that is roughly 'real number' and when you write out + and * without specifying the types of these operations, something in the language or the interpreter/compiler will default to assuming that, and you need to do something 'more' (e.g. define your own data type) to get complex * and + as first-class operations
obliv: or never "do the Re(z) = Re(w), etc."
a big part of linear algebra at one level of abstraction is realizing how much of it works over any field. row reducing a matrix involves adding rows to other rows, and scaling them by nonzero scalars. "scaling" if it's complex numbers does involve complex multiplication, but from the point of view of the row operation, you really don't need to think in terms of "i have to do (a+bi)(c+di) = (ac - bd) + (ac+bd)i, where the multiplication on the right hand side is the only true multiplication"
and it's maybe better if you don't think of it that way
maybe think of the formula for entries of A^{-1} in terms of the entries of A, when A is an invertible 2x2 matrix. exactly the same formulas in both the real and complex cases
it isn't like there's a "complex formula" that's somehow different from the "real formula". it's the same formula, and it only becomes complicated if you want a formula for the real and imaginary parts of the entries of A^{-1} in terms of the corresponding parts of the entries of A
and maybe you want that, but i don't know why you'd automatically want that as a consequence just of wanting to do linear algebra over C