2017-10-18 15 views
1

Y a-t-il un nom spécial pour faire une assignation dans un conditionnel? Voici un exemple de ce que je demande au sujet dans C:Comment appelez-vous faire une affectation dans un conditionnel?

// Assume a and b have been previously defined and are compatible types 
if((a = b)) { // <- What do you call that? 
    //do something 
} 

Un couple de mes amis et moi sommes convaincus qu'il ya un nom, et d'autres personnes ont convenu qu'il y en a un, mais nous Je ne le trouve nulle part. Est-ce que quelqu'un ici a déjà entendu un terme pour cela?

+7

Si je vois un code comme ça, j'ai tendance à l'appeler "erreur". Il était généralement destiné à être 'a == b'. Mais cela peut aussi être intentionnel. – Yunnosch

+1

@Yunnosch Haha, tu m'as battu. Si c'est intentionnel, il vaut mieux le signifier avec des doubles parens comme dans 'if ((a = b))'. GCC et Clang ont tous les deux une option '-Wparentheses' qui peut vous avertir si vous faites une assignation dans un conditionnel sans les doubles parens. –

+0

Cela s'appelle «déballage facultatif» dans Swift. ;) –

Répondre

1

Si l'on suppose qu'une cession est intentionnelle, il n'y a pas de nom particulier pour cela. spécification du langage C place une exigence très faible sur l'expression de contrôle d'une instruction if:

6.8.4.1-1: Le contrôle de l'expression d'une instruction if doit avoir le type scalaire.

Une expression mission satisfait à cette exigence, tant que a et b sont scalaire. Une comparaison implicite à zéro est effectuée sur le résultat de cette mission:

6.8.4.1-2: Dans les deux formes, la première est exécutée si sous-structure l'expression compare inégale à 0. Dans la forme else, la deuxième est exécutée si sous-structure l'expression compare égale à 0.

Notez que les compilateurs publieraient un avertissement quand ils voient une mission comme ça, parce que manquant deuxième = est une source commune d'erreurs. You can prevent these warnings using parentheses, as described in this Q&A.

1

Il n'a pas vraiment de nom, bien que les gens l'appellent des choses diverses. Si le code suit votre question:

if(a = b)... 

alors des termes communs sont: bug, erreur, etc. Cependant, si b n'est pas une variable mais une expression, par exemple comme dans les modèles communs C:

if((c = getchar()) != EOF)... 
while(*q++ = *p++)... 

alors il pourrait être appelé un idiome , modèle, etc.

+0

si (a = b) est une construction légitime, bien que généralement il est écrit comme une erreur –

+0

@JooseppiLuna - exactement, c'est un code valide mais est probablement rarement ce qui était prévu d'où les gens l'appellent souvent * bug *, * erreur *, ou * erreur * ... – CRD

0

Je ne sais pas si elle a un nom mais je l'appellerais "fonction utile que personne ne comprend". C'est très utile en effet. Nous pouvons considérer cela comme un argot.

En C++ par exemple, vous pouvez l'utiliser en déclarant une variable directement, ce qui est utile pour les contrôles de sécurité:

if (Object * a = takeObject()) { // un ne nullptr }

Ou quand je ne veux pas répéter une déclaration dans une boucle:

while (a = next()) { 

} 

au lieu de:

a = next(); 
while (a) { 

    a = next(); 
} 

Mais généralement, ce ne sont que des erreurs que les compilateurs comme gcc et clang donnent des avertissements (et ils vous obligent à mettre un horrible double tuple pour faire taire l'avertissement!).