As others have already said, there is no way to guarantee execution order, so there are three answers that are "sort of" correct (0,0 / 1,1 / 2,2 - the first query can return any of the three rows; the second will not change the value); and only one answer that is really correct (it depends).
Someone comments on this topic that SELECT is more forgiving than SET. Which is exactly the reason why I prefer using SET. If I make a mistake in my code and get no rows or multiple rows, I much rather have an error than get what I consider to be a random value without any warning.
Unfortunately, SET does not allow us to assign values from a single query to multiple variables. I am still waiting for the day Microsoft finally implements "SET (@var1, @var2, @var3) = SELECT (col1, col2, col3) FROM dbo.MyTable WHERE KeyVal = @MyKey;"