SICP: applicative or normal order evaluation
This is how I understand it:
; Normal
(test 0 (p))
(if (= 0 0) 0 (p)))

Normal order continues expanding because it hasn't yet reached an expression with only primitives, which recurses into an infinite loop replacing (p) by (p).
; Applicative
(test 0 (p))
(if (= x 0) 0 y))
(if (= 0 0) 0 y))

Applicative order applies the procedure (the if predicate) to the arguments that are the values of its sub-expressions. Because if short-circuits, the expression reduces to #t before before evaluating sub-expression y.