Szerintem az az || balról jobbra megy, s ha az első nem 0, már nem értékeli ki a másodikat. Úgy tudom, ez konzekvens, például azért, hogy lehessen ilyet csinálni:
uint32_t *p;
if (p && *p) --*p;
Itt ugye, ha p == NULL, akkor már nem dereferálja, s nem nézi meg, hogy a sehova sem mutató pointer által mutatott érték nulla-e.