This example has lots of problems. Parameters may be widened when they are passed, so a char might be passed as an int , for instance. The order of evaluation may differ from the order in which they are pushed. Do not depend on this. Do not modify string constants.
Some libraries attempt to modify and then restore read-only string variables.
Programs sometimes won't port because of these broken libraries. The libraries are getting better. If the address is used in a comparison, sometimes the program will run but clobber data, give wrong answers, or loop forever. It is likewise only portable to use arithmetic operators on pointers that both point into the same array or the first element afterwards. Word size also affects shifts and masks.