ok i think this will work even if nested, without statement expressions (so will compile on MSVC)
ORV(x, y) (tmp = (x) ? tmp : (y))
ANDV(x, y) (tmp = (x) ? (y) : tmp)
the AND version felt dicey but i realized that if you get to the (y) expression the tmp value is never evaluated so it's fine if it gets clobbered