web-dev-qa-db-fra.com

PAS (~) vs NEGATION (!)

#include <iostream>

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

 }

La sortie est -5, -4, -3, -2. Ne devrait-il pas imprimer des valeurs jusqu'à -1? Pourquoi est-ce seulement jusqu'à -2? Et s'il vous plaît, expliquez-moi la différence entre les opérateurs "non" et "négation". Chaque fois que j'écris un programme, ils sont à l'origine de bogues.

while(i)

Je sais que la condition de boucle sera vraie pour les i positifs et négatifs sauf 0.

while(!i) vs while(~i)

Pour quelles valeurs de "i" les deux boucles ci-dessus sont-elles exécutées?

21
tez

Lorsque i arrive à -1, La valeur de ~i Est ~-1 Ou 0, Donc la boucle while arrête l'exécution. L'opérateur ! Fonctionne car il fait quelque chose de complètement différent; il en résulte 1 pour les valeurs de 0 et 0 pour toutes les autres valeurs. ~ Est une négation au niveau du bit.

Un peu plus en détail:

  • ~ Prend chaque bit dans un nombre et le fait basculer. Ainsi, par exemple, 100102 deviendrait 011012
  • -1 Est tout en binaire quand un entier signé par complément à deux.
  • ~0b…11111111 Est 0.

Pourtant:

  • !0 Est 1, !anythingElse Est 0
  • -1 N'est pas 0
  • !-1 Est toujours 0

Et si vous voulez réellement boucler en incluant i == -1, Utilisez simplement while (i) au lieu de while (~i).

36
Ry-

Vous avez raison de dire que i == -1 Est la condition de sortie: votre boucle est équivalente à

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

Lorsqu'il est écrit de cette façon, il devrait être clair pourquoi -1 N'est pas imprimé, la valeur est d'abord imprimée, et ensuite seulement incrémentée, c'est pourquoi -2 Est la dernière valeur que vous imprimez.

L'opérateur !, En revanche, ne produira 1 Que s'il reçoit un zéro. C'est pourquoi la boucle afficherait -1 Lorsque l'opérateur ! Est utilisé dans la condition de boucle.

5
dasblinkenlight

'~' est l'opérateur qui: ~ x = -x-1 et quand i = -1, alors ~ i = 0. si vous vous demandez la valeur de ~ i, vous pouvez simplement les imprimer:

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

puis vous trouverez: -5 4 -4 3 -3 2 -2 1 -1 0 0 -1 1 -2 2 -3 3 -4

2
aasa