C'era qualche lingua in cui i suoi operatori logici restituivano solo un vero o un falso?

-4

Ricordo in passato, per alcune lingue che non ricordo, che si tratti di Fortran, Pascal o Scheme, un operatore logico

2 || 3

restituirà sempre un valore booleano.

Ma nelle lingue moderne: JavaScript, Ruby, Python2, restituiscono tutti 2 .

Voglio fare attenzione a quali lingue comuni restituiscono rigorosamente vero / falso e quali lingue comuni restituiscono l'ultimo valore valutato?

    
posta 太極者無極而生 13.04.2017 - 02:10
fonte

3 risposte

3

The C Language:

#include <stdio.h>

int main()
{
    printf(2||3 ? "true\n" : "false\n");

    return 0;
}

In C, lo zero viene interpretato come false . Qualsiasi altro valore è interpretato come true .

Ecco perché cose come

while(x) { }

funziona correttamente, se x decrementa verso zero. Questo è considerato idiomatico C.

Esempio di lavoro in ideone: link

    
risposta data 13.04.2017 - 02:20
fonte
2

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.

    
risposta data 13.04.2017 - 09:52
fonte
1

C / C ++ Immagino? Anche se usano 1 e 0 invece di true e false ...

La maggior parte delle lingue dinamiche restituirà 2 perché possono e perché è utile. No in questo caso particolare, ma quando si desidera impostare un valore predefinito per alcune variabili:

some_variable = setting or default_value

invece di

if setting:
    some_variable = setting
else:
    some_variable = default_value

Le lingue statiche, d'altra parte, tendono a respingere 2 || 3 del tutto, perché hanno imparato che trattare tutto come booleans è bug-prune.

L'unica lingua che conosco (potrebbero essercene altri) dove 2 || 3 produce true (a differenza di 1 ) è D , un linguaggio statico con un tipo bool corretto, ma consente comunque di trattare numeri (o puntatori) come booleani: link . Poiché è statico, non può restituire 2 (o non consentirebbe 2 || true ), quindi deve convertirlo nel "minimo comune denominatore" - un valore booleano, true .

    
risposta data 13.04.2017 - 02:31
fonte

Leggi altre domande sui tag