In molti linguaggi tipicamente (staticamente), questo sarebbe semplicemente un errore di tipo, ad es.
Scala
2 || 3
// <console>:12: error: value || is not a member of Int
// 2 || 3
// ^
Haskell
2 || 3
-- <interactive>:1:1: error:
-- • No instance for (Num Bool) arising from the literal ‘2’
-- • In the first argument of ‘(||)’, namely ‘2’
-- In the expression: 2 || 3
-- In an equation for ‘it’: it = 2 || 3
F♯
2 || 3;;
// 2 || 3;;
// ^
//
// stdin(1,1): error FS0001: This expression was expected to have type
// 'bool'
// but here has type
// 'int'
C♯
2 || 3;
// (1,1): error CS0019: Operator '||' cannot be applied to operands of type 'int' and 'int'
Java
2 || 3
// error: bad operand types for binary operator '||'
// 2 || 3
// ^
// first type: int
// second type: int
// 1 error
Poiché gli operatori booleani possono essere applicati solo agli operandi booleani, valutano naturalmente valori booleani.
Nelle lingue in cui non è un errore di tipo, la valutazione di uno degli operandi trasmette strettamente più informazioni rispetto alla valutazione di un valore booleano, quindi perché non farlo in questo modo?
L'unica eccezione che riesco a pensare è il già menzionato linguaggio D.