Posso usare l'operatore not in C ++ su valori int?
-
29-09-2019 - |
Domanda
domanda strana, ma qualcuno mi ha mostrato questo, Mi chiedevo si può utilizzare il no! operatore int in C ++? (Il suo strano per me).
#include <iostream>
using namespace std;
int main()
{
int a=5, b=4, c=4, d;
d = !( a > b && b <= c) || a > c && !b;
cout << d;
system ("pause");
return 0;
}
Soluzione
Sì. Per i tipi integrali, i rendimenti !
true
se l'operando è pari a zero, e false
altrimenti.
Quindi, !b
qui significa semplicemente b == 0
.
Questo è un caso particolare in cui un valore viene convertito in un bool
. Il !b
può essere visto come !((bool)b)
quindi la domanda è: che cosa è la "truthness" di b
. In C ++, tipi aritmetici, tipi di puntatore e enum possono essere convertiti in bool
. Quando il valore è 0 o nullo, il risultato è false
, altrimenti è true
(C ++ §4.1.2).
Naturalmente le classi personalizzate possono anche sovraccaricare il operator!
o operator
<< em> tipi possono essere convertito al bool > per consentire l'!b
per le loro classi. Per esempio, std::stream
ha sovraccaricato la operator!
e operator void*
per il controllo della failbit, in modo che idiomi come
while (std::cin >> x) { // <-- conversion to bool needed here
...
può essere utilizzato.
(Ma il codice !( a > b && b <= c) || a > c && !b
è solo criptico.)
Altri suggerimenti
In origine, in C (su cui C ++ si basa) non c'era nessun tipo booleano. Al contrario, il valore "vero" è stato assegnato a qualsiasi valore diverso da zero e il valore "false" è stato assegnato a qualsiasi cosa che valuta a zero. Questo comportamento esiste ancora in C ++. Così, per un int x
, le espressioni !x
mezzi "x
non è vero", che è "x
non diverso da zero", vale a dire se è vero x
è pari a zero.
È possibile, !b
è equivalente a (b == 0)
.
Il test int è vero per i non-valori zero e falso per i valori zero, quindi non è solo vero per i valori zero e falso per valori diversi da zero.
La build-in operatore !
Converte il suo argomento bool
. Previsto dalla norma che esiste una conversione da qualsiasi tipo aritmetico (int
, char
, .... float
, double
...) per bool . Se il valore di origine è 0 il risultato è true
, altrimenti è false