2010-11-08 5 views
12

Strana domanda, ma qualcuno mi ha mostrato questo, Mi chiedevo si può usare il no! operatore per int in C++? (è strano per me).non operatore in C++ per int?

#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; 
} 
+2

questo è un codice criptico, non facile da leggere, con un nome senza significato per le variabili. 'd =! (a> b && b c && !b;' Per favore, programma in modo pulito: scegli un buon nome e non moltiplicare numerose operazioni in una sola riga –

+9

@Stephane: "qualcuno mi ha mostrato questo". scrivi il codice, come eseguire le tue istruzioni? Come succede, solo il '! b' è pertinente alla domanda, quindi il resto potrebbe essere eliminato, ma poiché l'interrogante non capisce l'operatore'! ', questo potrebbe non essere ovvio. –

+0

@Steve.Ok, ma mi sono imbattuto spesso in quei nomi di variabili ... –

risposta

23

Sì. Per i tipi interi, ! restituisce true se l'operando è zero e altrimenti false.

Quindi !b significa solo b == 0.


Questo è un caso particolare in cui un valore viene convertito in un bool. Il !b può essere visualizzato come !((bool)b) quindi la domanda è qual è la "verità" di b. In C++, i tipi aritmetici, i tipi di puntatore e enum possono essere convertiti in bool. Quando il valore è 0 o null, il risultato è false, altrimenti è true (C++ §4.1.2).

Naturalmente classi personalizzate può anche sovraccaricare i operator! o operator < tipi possono essere convertiti in bool> per consentire l'!b per le loro classi. Ad esempio, std::stream ha sovraccaricato la operator! e operator void* per il controllo della failbit, cosicché 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.)

3

Il test per int è vero per valori diversi da zero e falso per valori pari a zero, quindi non è solo vero per i valori zero e falso per valori diversi da zero .

4

È possibile, !b è equivalente a (b == 0).

3

L'operatore incorporato ! converte il proprio argomento in bool. La norma specifica 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

5

Originariamente, in C (su cui è basato C++) non c'era alcun tipo booleano. Invece, il valore "true" è stato assegnato a qualsiasi valore diverso da zero e il valore "false" è stato assegnato a qualsiasi valore che valuti zero. Questo comportamento esiste ancora in C++. Quindi per un int x, le espressioni !x significa "x non vero", che è "x non diverso da zero", cioè è vero se x è zero.

+0

fantastico! molte grazie! – 001