Question

Considérez le code suivant :

float validateEntry()
{
    string entry;
    float value;

    getline(cin, entry);
    value = atof(entry.data());

    return ((isNumber(entry) && value >= 0) ? i
    : (cout << "Enter valid amount: ", validateEntry())
}

Pourquoi la dernière ligne (l'expression séparée par des virgules) est-elle autorisée et existe-t-il d'autres expressions qui peuvent être utilisées avec les instructions return en C++ ?

Je suis surtout confus quant à l'utilisation de la virgule et je me demande où est définie la syntaxe de cette expression (je n'avais aucune idée qu'elle existait et je n'aurais pas su où la trouver).Puis-je remplir cette dernière expression avec une quantité indéfinie de code ?si oui, quelles sont les limites, les exigences, etc. ?

Était-ce utile?

La solution

L'opérateur des virgules vous permet de grouper deux expressions sinon-sens.Les deux expressions sont toujours évaluées et le résultat est le résultat de la deuxième expression.C'est presque toujours une mauvaise idée de l'utiliser (car elle blesse la lisibilité juste pour enregistrer une ligne de code), sauf peut-être dans le haut d'une boucle pour la boucle.

Autres conseils

return [expression];

expression :
   expression , expression
   literal
   etc...

L'opérateur de la virgule sépare plusieurs expressions sur une seule ligne.Lorsqu'il est utilisé dans une déclaration d'affectation comme l'instruction de retour (attribution d'une valeur temporaire renvoyée), seule la valeur la plus à droite est attribuée.Les expressions précédentes sont exécutées de gauche à droite.Dans votre exemple, la valeur définie sur la fonction renvoyée est renvoyée.

J'utilise cette technique pour effacer les variables d'argumentation formelles sur l'échec.Surtout les routines COM dans lesquelles il y a un échec.Par exemple:

HRESULT func(..., IInterface **ppv)
{
...
If(!good)
  return (*ppv = 0), E_FAIL;
...
}

, est un opérateur comme + ou << vous pouvez donc l'utiliser librement presque partout où une expression est attendue.Les exceptions sont les contextes où une virgule est attendue avec une signification différente, comme dans un appel de fonction.Dans de tels contextes, vous devez lever l'ambiguïté de la virgule en ajoutant un jeu supplémentaire de parenthèses :

foo((b,c)); // call foo with a single argument

La déclaration que vous montrez est l'équivalent de :

// return ((isNumber(entry) && value >= 0) ? i : (cout << "Enter valid amount: ", validateEntry())

if(isNumber(entry) && value >= 0) {
    return i;
} else {
    cout << "Enter valid amount: ";
    return validateEntry();
}

C'est juste une manière « intelligente » d'exécuter conditionnellement le cout << "Enter valid amount: " avant d'appeler validateEntry() tout en utilisant le moins de lignes possible.Bien sûr, l'ensemble de la fonction n'est qu'un moyen « intelligent » de demander une entrée à plusieurs reprises jusqu'à ce qu'elle obtienne une entrée valide.OMI, une boucle serait meilleure que la récursivité ici.

? : est le seul opérateur ternaire du C++

sa syntaxe est logical-or-expression ? expression : conditional-expression

Vous pouvez en savoir plus à ce sujet sur MSDN

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top