2016-04-23 5 views
2

Disons que j'ai une fonction MyFunction qui renvoie une valeur de 0 à 10. 0 indique un succès et une erreur non nulle. Si je veux afficher une MessageBox avec la valeur que si elle est différente de zéro, je dois faire ce qui suit:Comment déclarer une variable dans une condition if?

int e = MyFunction(); 
if (e != 0) { MessageBox(e); } 

Si je veux avoir l'int variable e pour être locale sans provoquer de redéfinition (parce que je suis mauvais à nommer ou de quelque chose) je peux enfermer le tout dans des accolades et d'isoler la variable comme ceci:

int e; 
{ int e = MyFunction(); if (e != 0) { MessageBox(e); } } 

Est-il cependant possible de compresser ce en une seule instruction if au lieu comme ceci:

if (int e = MyFunction() != 0) { MessageBox(e); } //obviously does not work as intended 

Je sais si les instructions ne fonctionnent pas vraiment de cette façon mais est-il possible de le faire quand même en utilisant un peu de magie C++? Cela peut sembler trivial pour vous les gars, mais je veux vraiment faire ça. J'ai fait une recherche, a également demandé, mais pas de dés. Merci!

+3

_... C++ magie ... Demandez à la licorne. –

+0

_ parce que je suis mauvais à nommer ou quelque chose_ hmm ... :) – erip

+0

Qu'en est-il d'utiliser des exceptions pour la gestion des erreurs? – simpel01

Répondre

6

Vous pouvez le faire comme ceci:

if(int e = MyFunction()) 
{ 
    MessageBox(e); 
} 

Cela fonctionne parce que int convertit naturellement bool de sorte que le if() réussit quand e est une valeur non nulle (ou si elle se transforme en true valeur bool) .

L'avantage de ceci est que vous ne gaspillez pas la portée environnante avec des valeurs de retour d'erreur. Bien que cela puisse ne pas être aussi évident pour certains codeurs que de séparer l'appel de fonction du test.

+0

Certaines personnes considèrent que ce type de condition de véracité implicite est une forme mal définie, en particulier en C++. Je ne suis pas nécessairement l'un d'entre eux. –

+0

@ LightnessRacesinOrbit Je ne suis pas entièrement décidé sur la question. Il y a au moins une proposition pour les types de retour de statut avec une valeur optionnelle qui facilite ce style.Je pense que le fait que cela efface la portée environnante est précieux et peut contribuer à réduire les bogues provenant des variables de code de retour partagées et de la litière variable en général. – Galik

6

No.

Votre deuxième extrait de code est le bon/bonne/meilleure/la plus claire/moyen le plus facile de le faire.

N'essayez pas d'être trop intelligent.

0

Pas exactement ce que vous vouliez, mais si la cause est seulement en apparence d'enregistrement, vous pouvez utiliser for à la place if:

for(int e = MyFunction(); e!=0; e=0) MessageBox(e); 

mais je ne suis pas sûr qu'il ya des raisons de remplacer le code clair normal déclarations comme ça. Personne ne vous recommandera de telles solutions.