The obvious (and generally best) advice about things like this is "just don't do it."
Other than that, I find the easiest approach to be to think of them like Algol-style ifs. An Algol if was an expression, not a statement, so (much like a conditional, except readable) you could write something like this:
a = if b then c else d;
The transformation is really pretty simple. x ? is if (x) and : is else. Applying this to a nested conditional is actually pretty easy, and at least in my opinion, the result is much more readable.
a ? b: c ? d : e ? f : g ? h : i
Transforms to:
if (a) {
b;
} else if (c) {
d;
} else if (e) {
f;
} else if (g) {
h;
} else {
i;
}
The second is actually just about as easy, as long as you remember that x ? translates directly to if (x). Other than that, we follow the normal C rule that an else matches up with the most recent if that doesn't already have an else associated with it.
a ? b ? c : d : e
...becomes:
if (a) {
if (b) {
c;
}
else {
d;
}
} else {
e;
};