41 votes

La syntaxe de suppression de CMD

Je suis tombé sur cette utilisation plutôt inhabituelle de «supprimer». Vous voulez juste savoir si la ligne suivante supprime les deux pointeurs ou seulement le premier?

55voto

James McNellis Points 193607

C'est sans doute une erreur. La virgule est ici l'opérateur virgule, pas un séparateur. Seul le premier pointeur, ptr1 est supprimé.

Le deuxième pointeur, ptr2, est juste un faire-rien d'expression.

L' delete opérateur a une priorité plus élevée que l' , de l'opérateur, de sorte que l'expression est analysée comme s'il avait été écrit:

(delete ptr1) , (ptr2)

et pas comme si il avait été écrit:

delete (ptr1 , ptr2)

Si , avaient une plus grande priorité que delete, alors seulement le deuxième pointeur serait supprimé.

11voto

Jerry Coffin Points 237758

James McNellis est vrai que c'est l'opérateur virgule, mais il a la priorité de l'opérateur de mal. Il est (apparemment), en pensant qu'il travaille en tant que:

delete (ptr1, ptr2);

auquel cas il serait en droit-il serait de supprimer uniquement la deuxième question. En réalité, cependant, supprimer est également un opérateur, et a sensiblement une priorité plus élevée que l'opérateur virgule (ce qui est le plus bas de la priorité que possible), de sorte qu'il fonctionne vraiment comme:

(delete ptr1), ptr2;

De sorte qu'il supprime le premier pointeur, et le résultat de l'expression est la valeur de la deuxième pointeur -- qui n'a pas été supprimée, de sorte qu'il est encore valide (s'il a été précédemment).

J'avais echo Martin York conclusion, et je pense que cette sauvegarde. Je doute que même un pour cent de programmeurs C++ sais C++ ainsi que James McNellis -- lors de sa réponse sur ce qu'est une construction n'est faux, c'est une solide indication que presque personne ne peut savoir ce qu'il fait vraiment. J'avais postulons que personne ne peut être sûr c'est de faire ce qui était prévu. En fait, je suppose qu'il a l'intention de supprimer à la fois les objets, qu'il devrait ne pas faire (c'est à dire, ne le sera pas, à moins que le compilateur a un bug).

[Edit: je vois que pendant que j'écrivais ce, James a corrigé sa réponse. Mes excuses à James, mais je pense que la base de la conclusion des stands, donc je ne suis pas la suppression de cette, au moins pour l'instant.]

7voto

Ian Cook Points 184

Je ne le recommanderais pas, mais ce qui suit fonctionnera -

Cela peut être généralisé comme suit -

5voto

Lorenzo Points 2772

Considérez ce code d'exemple :

La sortie est la suivante:

La raison, comme d'y répondre déjà James, est la préséance de l'opérateur.

5voto

Loki Astari Points 116129

Juste en regardant ça me fait peur.

Ne pas utiliser cela, même si elle est légale que la plupart des gens doivent s'arrêter et de penser (et va toujours se tromper (l'une des deux premières réponses doit être erronée car ils se contredisent, mon premier instinct est des problèmes d'opérateur de virgule (mais je ne sais pas))).

Même maintenant, je ne répondrais pas à la question jusqu'à ce que j'ai ecmis un exemple et l'ai testé et même alors, j'aurais peur des cas de coin dans la langue qui causerait des problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X