This is one area where a little computer science can be helpful. Asked to test the value of $0^0$ by implementing the function $x^y$, one person writes this program
def powernat(real x, nat y)
if y = 0 :
return 1
else:
return x * powernat(x,y-1)
and another person writes this program
def powerreal(real x, real y)
return exp(y * log(x))
Here "nat" is a data type for natural numbers and "real" is a data type for real numbers.
We can see immediately that something different will happen with $0^0$. The powernat function will return 1, but the powerreal function will cause an error, because $\log(0)$ is not defined.
The situation in mathematics is not so different - we often define exponentiation for natural numbers as in powernat, and exponentiation for real numbers as in powerreal. But we have no notation to distinguish powernat from powerreal: we write both of them as $x^y$ and rely on context only to tell them apart.
This causes trouble when we write expressions such as $0^0$. If we mean for this to be treated as the powernat function - which is the case in the definition of a power series - then we read $0^0 = 1$. But if we want this to be treated as the powerreal function - which is also used, essentially, to treat complex exponentiation - then $0^0$ is undefined (as is $0^1$, actually...).
For the more basic arithmetical operations, this does not cause any issues. For example $1 + 1 = 2$ is true regardless of whether we think of the numbers $1$ and $2$ as natural numbers or as Dedekind cuts representing real numbers. In each of these cases the "+" means something different, but it causes no confusion. In the case of $x^y$, though, it does matter which definition we use.