Да, это допустимое назначение, но назначение работает справа налево.Если разбить его, это эквивалентно:
y = Z;
x = y;
Причина, по которой вы получаете разные значения, вероятно, потому что Z не был определен и, вероятно, смотрит на мусор.Вы можете получить другие результаты снова, если вы запустите свою программу несколько раз.