The reason for the low precedence of & and | in PL/I and C is that those were used as Boolean operators in conditions. For example lessequal(a,b) { return(a<b | a==b); }