2012-07-20 5 views
16
#include <iostream> 

using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int i=-5; 
    while(~(i)) 
    { 
     cout<<i; 
     ++i; 
    } 

} 

L'uscita è -5, -4, -3, -2. Non dovrebbe stampare valori fino a -1? Perché è solo fino a -2. E, per favore, spiegami la differenza tra gli operatori "non" e "negazione". Quando scrivo un programma, sono la fonte di bug.NOT (~) vs NEGATION (!)

while(i) 

So che la condizione del ciclo sarà vero per i positivi e negativi del tranne 0.

while(!i) vs while(~i) 

Per quali valori di 'i' due precedenti cicli vengono eseguiti?

+0

Se non si ricorda la differenza tra '!' e '' ~, l'uso '!'. È quasi sempre quello che vorresti. '~' è raramente necessario. – duskwuff

+1

Suggerimento che potrebbe esserti utile, poiché la risposta corretta era già stata pubblicata. Per i tipi interi (modulari), '~ i == -i - 1'. –

+3

Gli operatori hanno effettivamente nomi in C++: '!' È 'not' e' ~ 'è' compl'. (Minuscolo, non maiuscolo) – MSalters

risposta

24

Quando i arriva a -1, il valore di ~i è ~-1 o 0, affinché il ciclo while interrompe l'esecuzione. L'operatore ! funziona perché fa qualcosa di completamente diverso; risulta in 1 per i valori 0 e 0 per tutti gli altri valori. ~ è una negazione bit per bit.

Un po 'più in dettaglio:

  • ~ prende ogni bit in un numero e commuta esso. Così, per esempio, 10010 diventerebbe 01101
  • -1 è tutti quelli in binario quando complemento a due firmato intero.
  • ~0b…11111111 è 0.

Tuttavia:

  • !0 è 1, !anythingElse è 0
  • -1 non è 0
  • !-1 è ancora 0

E se si vuole realmente l oop compreso i == -1, utilizzare solo while (i) anziché while (~i).

5

Lei ha ragione su i == -1 essere la condizione di uscita: il loop è equivalente a

int i=-5; 
while(i != -1) 
{ 
    cout<<i; 
    ++i; 
} 
// i == -1 immediately after the loop 

Quando scritto in questo modo, dovrebbe essere chiaro perché -1 non viene stampato il valore viene prima stampato, e solo allora incrementato , ecco perché -2 è l'ultimo valore che si stampa.

L'operatore !, d'altra parte, produrrà 1 solo quando viene assegnato uno zero. Ecco perché il ciclo dovrebbe stampare -1 quando l'operatore ! viene utilizzato nella condizione di loop.

2

'~' è l'operatore che: ~ x = -x-1 e quando i = -1, quindi ~ i = 0. se vi chiedete il valore di ~ i, si può semplicemente stamparle:

#include <iostream> 

using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int i=-5; 
    for (int i = -5; i <= 3; i++) 
    { 
    cout<<i<<" "<<(~i)<<endl; 
    } 
} 

e poi si trova: -5 4 -4 3 -3 -2 1 -1 0 0 -1 1 -2 2 -3 3 -4