Как уже отмечали другие, это неопределенное поведение. Но почему?
При программировании на языке C существует существенная разница между оператором и выражением. Оценка выражения должна давать вам те же наблюдаемые результаты в любом случае (например, (x + 5) + 2 - это то же самое, что x + (5 + 2)). Заявления, с другой стороны, используются для упорядочения побочных эффектов, то есть, как правило, приводят, например, к записи в какую-то область памяти.
Учитывая вышеизложенное, выражения безопасны для "вложения" в операторы, тогда как вложения в выражения - нет. Под «безопасным» я подразумеваю «не удивительные результаты».
В вашем примере у нас есть
x^=x || x++ || ++x;
В каком порядке должна проводиться оценка? С || оперирует выражениями, не важно, идем ли мы (x || x ++) || ++ x или x || (x ++ || ++ x) или даже ++ x || (х || х ++). Однако, поскольку x ++ и ++ x являются операторами (хотя C позволяет использовать их как выражения), мы не можем продолжать алгебраические рассуждения. Итак, вам нужно будет явно указать порядок операций, написав несколько операторов.