D'après ce que j'ai compris, l'affectation s = "Hello" ; devrait seulement provoquer l'affectation de "Hello" à s, mais l'opération ne devrait pas renvoyer de valeur.
Votre compréhension est 100% incorrecte. Pouvez-vous expliquer pourquoi vous croyez cette fausse chose ?
Quel est le raisonnement qui permet aux instructions d'affectation de retourner une valeur ?
Tout d'abord, l'affectation déclarations ne produisent pas de valeur. Affectation expressions produire une valeur. Une expression d'affectation est une déclaration légale ; il n'y a qu'une poignée d'expressions qui sont des déclarations légales en C# : les attentes d'une expression, la construction d'instances, l'incrémentation, la décrémentation, l'invocation et les expressions d'affectation peuvent être utilisées là où l'on attend une déclaration.
Il n'existe qu'un seul type d'expression en C# qui ne produit pas une valeur quelconque, à savoir une invocation de quelque chose qui est typée comme renvoyant void. (Ou, de manière équivalente, une attente d'une tâche sans valeur de résultat associée.) Tous les autres types d'expression produisent une valeur, une variable, une référence, un accès à une propriété ou à un événement, etc.
Remarquez que toutes les expressions qui sont légales en tant que déclarations sont utiles pour leurs effets secondaires . C'est le point clé ici, et je pense que c'est peut-être la cause de votre intuition que les affectations devraient être des déclarations et non des expressions. Idéalement, nous devrions avoir exactement un effet secondaire par instruction, et aucun effet secondaire dans une expression. C'est est il est un peu étrange que du code ayant un effet secondaire puisse être utilisé dans un contexte d'expression.
Le raisonnement derrière l'autorisation de cette fonctionnalité est que (1) elle est souvent pratique et (2) elle est idiomatique dans les langages de type C.
On pourrait noter que la question a été posée : pourquoi est-ce idiomatique dans les langages de type C ?
Malheureusement, Dennis Ritchie n'est plus disponible pour poser des questions, mais je pense qu'une mission laisse presque toujours derrière elle la valeur qui vient d'être attribuée dans un registre. Le C est un langage très "proche de la machine". Il semble plausible et conforme à la conception du C qu'il existe une caractéristique du langage qui signifie essentiellement "continuez à utiliser la valeur que je viens d'attribuer". Il est très facile d'écrire un générateur de code pour cette fonction ; il suffit de continuer à utiliser le registre qui a stocké la valeur qui a été assignée.
50 votes
Pour référence, ce comportement est défini dans le C# spec : " Le résultat d'une expression d'affectation simple est la valeur affectée à l'opérande de gauche. Le résultat a le même type que l'opérande de gauche et est toujours classé comme une valeur. "
1 votes
@Skurmedel Je ne suis pas le downvoter, je suis d'accord avec vous. Mais peut-être parce qu'on a pensé que c'était une question rhétorique ?
1 votes
En pascal/delphi, l'affectation := ne renvoie rien. Je déteste ça.
20 votes
Norme pour les langues de la branche C. Les affectations sont des expressions.
0 votes
"L'affectation ... devrait seulement provoquer l'affectation de "Hello" à s, mais l'opération ne devrait pas retourner de valeur" -- Pourquoi ? "Quel est le raisonnement derrière le fait de permettre aux instructions d'affectation de retourner une valeur ?" -- Parce que c'est utile, comme le démontrent vos propres exemples. (Bon, votre deuxième exemple est stupide, mais
while ((s = GetWord()) != null) Process(s);
ne l'est pas).