To evaluate (*ptr-- + ++*str1), the compiler applies the rules of the C grammar: postfix operator bind stronger than prefix operators, they are applied from left to right, then prefix operators are applied to the result from right to left.
*ptr-- hence applies * to the result of ptr--, which is the original value of ptr, the side effect on ptr occurs sometime before the next sequence point, ie the next statement. Since ptr has been assigned to the beginning of the array ch, *ptr-- has the value 'z'.
Note however that decrementing ptr before the beginning of the array has undefined behavior... While this particular instance should not cause any problem on most current systems, the mere presence of undefined behavior may let the compiler perform aggressive optimisations with counterintuitive results.
++*str is parsed as ++(*str): the value is *str + 1, hence the next character in the character set after z(*), and the value of *str is incremented as a side effect sometime before the next sequence point.
This is another instance of undefined behavior because *ptr and *str refer to the same element of the array ch: the side effect on *str clearly conflicts with *ptr reading the same element. The C Standard describes this as undefined behavior because an object modified in an expression can only be read to compute the modified value, which is not the case here.
The observed behavior, the output of 235, is consistent with the full expression evaluating to ('z' + ('z' + 1)) - 10 along with unobserved side effects and the use of the ASCII encoding where 'z' has the value 122: 122 + 122 + 1 - 10 = 235.
Note that this is only a potential explanation for the observed behavior, but the C Standard does not guarantee this behavior at all: the behavior is undefined and the program could behave in different ways: it could output 236, 329, 330, it could stop with or without an error or produce other unpredictable results.
(*) Note that ++(*str) would also have implementation defined behavior on a hypothetical system where 'z' would have the value of CHAR_MAX with char signed by default. This makes ++*str attempt to convert a value beyond the range of signed type char, a situation covered by 6.3.1.3 [...] Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised. . Many systems have 'z' with a value of 122 and CHAR_MAX set to 127... close but no cigar:)