Ваш код имеет неопределенное поведение .
a[0] = a[0] - (a[0] = a[1]);
Само по себе подвыражение (a[0] = a[1])
действительно. Он присваивает значение от a[1]
до a[0]
и возвращает присвоенное значение.
Проблема в том, что a[0]
изменяется дважды в одном выражении, и эти две модификации не последовательны, что означает, что язык не сообщает нам, какая из них произойдет первой. (В терминах C90 / C99 две модификации не разделены последовательностью .)
Более простой пример этого:
x = 2 + (x = 1);
Здесь x
модифицируется дважды. Язык не просто говорит, что две модификации могут происходить в любом порядке; это говорит о том, что поведение не определено. Другими словами, язык ничего не говорит о том, что произойдет. Это может привести к сбою, может дать вам некоторые результаты мусора, или, что хуже всего, это может сделать то, что вы ожидаете, что он будет делать. (Это наихудший случай, потому что это означает, что у вас все еще есть серьезная ошибка, которую будет сложно обнаружить и диагностировать.)
Итог: Независимо от того, какую строку кода намеревался сделать , безусловно, есть более ясный и менее двусмысленный способ сделать это. Код в вашем вопросе, не слишком резкий, может даже не быть C.