10
votes

tandis que (0 = 0) évalue en faux

b=10;
while(a=b) {
  b--;
  if(b==-10)break;
}
B goes from 10 to -10.
In my world, the while-statement, a=b, should always be true (since the assigment always "goes well"). That is not the case.
When the loop stops, b will have a value of 0.In my world, it should pass 0 and go all the way to -10, when the if-statement kicks in.Have I misunderstood something major?
(Code tested in IE8 and Adobe Acrobat)

4 commentaires

Oui, c'est un malentendu qu'une mission devrait évaluer intrinsèquement quelque chose de vérité.


@NPUP Tout va évaluer quelque chose de vérité, tout ce que vous voudrez peut-être que la vérité soit: D


En outre, en utilisant quelques espaces ici et il vous aidera à long terme: si (b == -10) casse;


L'affectation évalue la valeur attribuée à la valeur attribuée. (A = 4) est identique à ce que 4. A = 0 est identique à 0, et 0 est identique à faux.


9 Réponses :


3
votes

évidemment, si (0) est équivalent à si (faux).

Donc, si (A = B) n'est vrai que si B est égal à quelque chose qui deviendrait vrai si jeté à Boolean.

Donc, si dise A et B est le même type, il sera considéré comme vrai si B est non nulle.

Ce que je ne comprends pas, c'est pourquoi ce code?


0 commentaires

29
votes
(0 = 0) == 0 == false

0 commentaires

1
votes

0 est FALSY en JavaScript, a = B Renvoie 0 lorsque B atteint 0, JavaScript lit donc false.


0 commentaires

9
votes

0 est une valeur fausses, 0 == false est vrai, donc dès que b hits 0, puis a = b évalue à False et la boucle pause.

une solution simple serait xxx

ou dans ce cas, en raison de la pause ; instruction que vous pouvez simplement utiliser < Pré> xxx


3 commentaires

Est-ce que False est le terme officiel pour cela? Cela semble être un mot étrange à utiliser.


Falsy et Truthy sont des descriptions bien connues de la coercition de type à une valeur booléenne. J'hésiterais à dire "officiel".


@baultista: "faux" est un terme maquillé qui est largement utilisé autour du débordement de pile, en particulier dans des questions pour des langages dynamiquement typés comme JS :-)



4
votes

Oui, car la valeur de l'affectation est la valeur de l'expression attribuée. Qui est 0, qui est évalué à false.


0 commentaires

0
votes

tandis que la boucle attend une condition I.e. tandis que (condition) et traite avec vrai ou faux Par conséquent, votre boucle ci-dessus se traduit par tandis que (a) ergo la condition de la boucle est la valeur d'un.

Quand A atteint 0, votre boucle pause.


0 commentaires

21
votes

La valeur d'une affectation est la valeur attribuée, de sorte que vous pouvez chaîner des affectations a = b = 2 par exemple, alors lorsque b = 0 , la valeur de a = b est 0.


1 commentaires

+1 C'est la chose importante qui n'a pas été clarifiée dans la plupart des réponses. La "valeur" d'une opération d'affectation est la valeur attribuée, et non quelque chose qui indiquerait si l'opération "va bien".



1
votes

La déclaration tandis que, A = B, devrait toujours être vraie (puisque l'affectation "va bien").

Ce n'est généralement pas une bonne idée de penser à la valeur de retour comme confirmation du succès de l'opération. L'exécution continue de votre code est l'indication que la mission s'est bien déroulée.

notamment, votre intuition est en fait en arrière à partir de la norme dans le script de shell UNIX, où 0 signifie a-ok! et non-zéro indique un autre résultat.

Maintenant que des choses comme des exceptions peuvent être utilisées pour indiquer un problème dans l'exécution, il existe de meilleurs mécanismes à utiliser pour cela.


0 commentaires

0
votes

En fait, 0 = 0 vous donnera le résultat de 0 qui est interprété comme faux. En d'autres termes tandis que (0 = 0) est à peu près la même chose que (0) qui enfreint la boucle.


0 commentaires