Well, except that C does not have exceptions (at least not in the way that C++ does).
Right, it has signals and almost no one ever bothers to test for EINTR.
longjmp for the win (or loss)!
How is it "the same"? If the evaluations of the individual arguments can't overlap, then the C example's problem still exists while the C++ example's problem doesn't. And if the order of evaluation were guaranteed but the evaluations could overlap, the C example wouldn't have a problem but the C++ example still would. To me the two problem's causes seem quite different.