#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?
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)
.
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.
'~' 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