Perché il tipo booleano in C ++ supporta ++ ma non -?

29

Perché l'operatore -- non esiste per bool mentre lo fa per l'operatore ++ ?

Ho provato in C ++ e non so se la mia domanda si applica a un'altra lingua. Sarò felice di sapere anche.

Lo so , posso usare l'operatore ++ con un bool. Rende qualsiasi bool uguale a true.

bool b = false;
b++;
// Now b == true.

Perché non possiamo usare l'operatore -- in modo opposto?

bool b = true;
b--;
// Now b == false;

Non è molto utile, ma sono curioso.

    
posta aloisdg 01.03.2014 - 23:11
fonte

3 risposte

52

Ai vecchi tempi di C, non esisteva un tipo booleano. Le persone hanno utilizzato int per l'archiviazione dei dati booleani e ha funzionato principalmente. Zero era falso e tutto il resto era vero.

Questo significa che se hai preso un int flag = 0; e più tardi ha fatto flag++ il valore sarebbe vero. Questo funzionerebbe a prescindere dal valore del flag (a meno che non lo abbiate fatto molto, si è verificato il rollover e si è tornati a zero, ma si ignora che) - incrementando la bandiera quando il suo valore era 1 avrebbe dato 2, il che era ancora vero.

Alcune persone lo usavano per impostare incondizionatamente un valore booleano su true. Non sono sicuro che sia mai diventato idiomatic , ma è in qualche codice.

Questo non ha mai funzionato con -- , perché se il valore era diverso da 1 (che potrebbe essere), il valore non sarebbe ancora falso. E se era già falso ( 0 ) e su di esso hai fatto un operatore di decremento, non sarebbe rimasto falso.

Quando si spostava codice da C a C ++ nei primi tempi, era molto importante che il codice C incluso in C ++ fosse ancora in grado di funzionare. E così nella specifica per C ++ (sezione 5.2.6 (si veda a pagina 71)) si legge:

The value obtained by applying a postfix ++ is the value that the operand had before applying the operator. [Note: the value obtained is a copy of the original value ] The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a complete object type. After the result is noted, the value of the object is modified by adding 1 to it, unless the object is of type bool, in which case it is set to true. [Note: this use is deprecated, see annex D. ]

The operand of postfix -- is decremented analogously to the postfix ++ operator, except that the operand shall not be of type bool.

Questo è nuovamente menzionato nella sezione 5.3.2 (per l'operatore prefisso - 5.2.6 era su postfix)

Come puoi vedere, questo è deprecato (allegato D nel documento, pagina 709) e non dovrebbe essere usato.

Ma questo è il motivo. E a volte potresti vedere il codice. Ma non farlo.

    
risposta data 02.03.2014 - 01:48
fonte
2

Per far fronte parzialmente al codice legacy che ha utilizzato int o simili come tipo booleano.

    
risposta data 02.03.2014 - 00:47
fonte
1

Per comprendere il significato storico di questa domanda, devi considerare il caso del Therac-25. Il Therac-25 era un dispositivo medico che forniva radiazioni ai malati di cancro. È stato afflitto da cattive pratiche di programmazione che hanno contribuito al suo scarso livello di sicurezza (con più morti attribuite ad esso).

link

(vai in fondo alla pagina 3)

Every pass through the Set-Up Test routine increments the upper collimator position check, a shared variable called Class3. If Class3 is nonzero, there is an inconsistency and treatment should not proceed. A zero value for Class3 indicates that the relevant parameters are consistent with treatment, and the beam is not inhibited.

...

During machine setup, Set-Up Test will be executed several hundred times since it reschedules itself waiting for other events to occur. In the code, the Class3 variable is incremented by one in each pass through Set-Up Test. Since the Class3 variable is 1 byte, it can only contain a maximum value of 255 decimal. Thus, on every 256th pass through the Set-Up Test code, the variable overflows and has a zero value. That means that on every 256th pass through Set-Up Test, the upper collimator will not be checked and an upper collimator fault will not be detected. The overexposure occurred when the operator hit the "set" button at the precise moment that Class3 rolled over to zero. Thus Chkcol was not executed, and F$mal was not set to indicate the upper collimator was still in field-light position. The software turned on the full 25 MeV without the target in place and without scanning. A highly concentrated electron beam resulted, which was scattered and deflected by the stainless steel mirror that was in the path.

Il Therac-25 usato qualcosa come l'equivalente di operator++ su un bool . Tuttavia, il linguaggio di programmazione utilizzato non era C ++ e il loro tipo di dati non era bool . A differenza della garanzia in C ++, tuttavia, un tipo intero normale continua semplicemente a salire. Il loro tipo di dati era l'equivalente di uint8_t .

C ++ ha deciso di mantenere il operator++ in giro per le persone abituate a programmare in questo modo, ma invece di incrementare il valore, semplicemente lo imposta su true per evitare cose come questa.

Tieni presente che operator++(bool) è deprecato.

link

Allegato D di C ++ 14:

D.1 Increment operator with bool operand
The use of an operand of type bool with the ++ operator is deprecated (see 5.3.2 and 5.2.6).

    
risposta data 15.03.2014 - 17:59
fonte

Leggi altre domande sui tag