Je veux déclarer une variable locale entre parenthèses d'une déclaration IF. Par exemple.
char c = getc(stdin); if(c == 0x01) { bla... }
3 Réponses :
Je ne savais pas comment créer une variable et tester sa valeur avec un Vous pouvez toujours placer la relève si code> jusqu'à ce que certaines des solutions affichées. Cependant, vous pouvez utiliser le commutateur
code>. Cela vous permettrait de réagir aux valeurs supplémentaires (peut-être
eof code>):
si code> dans une fonction inlined Au lieu de cela, et le code sera un peu plus propre. Si vous voulez vraiment le code source juste à cet endroit, mais sans créer de nouvelle portée autour d'un
si code> avec une nouvelle variable, alors peut-être une Lambda serait acceptable pour vous. P>
template <typename T>
class SetAndTest {
const T test_;
T set_;
public:
SetAndTest (T s = T(), T t = T()) : set_(s), test_(t) {}
operator bool () { return set_ == test_; }
operator bool () const { return set_ == test_; }
operator T & () { return set_; }
operator T () const { return set_; }
};
//...
if (auto c = SetAndTest<int>(getc(stdin), 0x01)) {
ungetc(c, stdin); //or bla...
}
Wow, n'a jamais pensé à cela.
Pourquoi vous répétez-vous surcharge de l'opérateur?
Si c'est la pollution des espaces de noms, vous vous inquiétez de vous pouvez toujours définir le de sorte que si code> instruction dans un bloc:
c code > durera seulement jusqu'à la fin du bloc d'être atteint. p> p>
Bien que je n'ai pas répondu à la question, cette façon de rédiger le code est simple, claire et efficace. Merci.
@ QLB1234 Parfois, une question, comme dans votre cas, demande efficacement "comment est-ce que je préfère écrire un mauvais code". Ces questions ne sont pas censées être répondues avec "Voici comment vous écrivez un mauvais code", mais avec "N'écrivez pas de mauvais code, faites cela à la place." :-)
@Nikosc.: L'appel de cette réponse est sa simplicité, mais je trouve rarement de telles constructions acceptables dans un examen de code. Lorsque je vois un bloc d'instruction autonome comme celui-ci, je pense toujours que le code doit être dans une fonction distincte.
peut em> définir la variable à l'intérieur du si code> déclaration très bien. Par exemple, cela devrait compiler:
if (char ch = 1 && ...
Ne pouviez-vous pas aussi utiliser une virgule?
@ SJE397: Curieusement, non - non autorisé dans ce cas.
Que fait le 0 || code>? Il ressemble à
ch = true code> arrivera inévitablement après
ch = getchar () code>.
Wikipedia note ceci comme cas d'utilisation pour l'opérateur de la virgule dans des exemples / conditions ici: en.wikipedia.org/wiki / Comma_Operator . Mais ils ont dit une fois que le grand mur était composé de figurines d'action Star Wars ...
@ SJE397: Chaque compilateur J'ai rejeté le code si vous essayez d'utiliser une virgule (et je pense que la norme les oblige à le faire).
@Potatoswatter: OOPS - Besoin d'un autre ensemble de parens à droite. Merci de le pointer.
@JerryCoffin -1 b>, peu importe le nombre de parens que vous avez mis là un booléen finira toujours dans ch code>. c'est à dire.
Char Ch = 0 || ((ch = getchar ()) == 42) code> n'aura jamais
ch == 42 code> à l'intérieur du corps de la if-énoncé i>.
@RefP: Quand tout est dit et fait, oui - mais ce n'est pas ce qu'il a demandé, n'est-ce pas? Lorsque la valeur est testée, la valeur est venue de getchar () code>, ce qu'il semble se soucier.
@Jerrycoffin et vous pensez que cela a du sens? il veut utiliser ch code> (c.-à-d. la valeur de
getchar () code>) à l'intérieur de la if-énoncé i> s'il voulait juste tester la valeur de
getchar () code>
getchar () == ... code> serait suffisant. Votre réponse implique que la valeur de
getchar () code> sera stockée dans
ch code> et restera à l'intérieur de la if-énoncé i>; quelque chose qui n'est pas vrai. Devis de OP B>: "Pour le dire couramment, je veux utiliser la variable (char c) à la fois dans la ligne de si et le corps de si, mais pas en dehors du si." / i>
@RefP: Je pense que vous inférez quelque chose qui n'est pas vraiment impliqué n'importe où. Il ne me semble pas beaucoup de sens de toute façon - il teste spécifiquement l'égalité à 1, la seule valeur qu'il peut avoir à l'intérieur de la déclaration code> si code> est une toute de toute façon (sinon, rien à l'intérieur du < code> si code> l'instruction peut exécuter).
@JerryCoffin sûr, mais vous devriez également mentionner que ce que vous faites est équivalent à si (getchar () == 0x1) {/ * Il suffit d'utiliser "true" au lieu de ch ici * /} code>
@Refp Ouais, c'est vrai. Le niveau de logique ou ( || code>) est supérieur à celui de l'affectation (
= code>). Si écrit comme ci-dessus mentionné,
ch code> n'abalte jamais à
getchar () code> et le corps de
si code> ne connaîtra jamais la valeur de
getchar () code>. Si oui, pourquoi cette question serait-elle exsite? J'ai presque accepté cette réponse pour une erreur, mais ce qu'il pense est toujours intelligent.
"Cela vous permet d'obtenir la création et l'initialisation du CH fait, puis [...]" en fait, le côté droit du || code> fait toujours partie de l'expression d'initialisation. La syntaxe de la condition
si code> est une expression ou une seule déclaration; Il n'y a pas de «déclaration suivie d'expression» et votre code est donc structuré de sorte que l'expression soit cachée dans l'initialisateur d'une déclaration.
De plus, votre code ne fait pas la chose prévue, comme vous dites ch code> est réaffecté à 1 ou 0, et ne conserve pas la valeur souhaitée résultant de
getchar () code>.
N.b. Ce code est uniquement bien défini car char code> n'a pas de constructeur non trivial, si vous avez essayé
si (nontridialinit p = 0 || (((P = quelque chose ()) == x )) code> Il serait indéfini car
p code> est affecté avant d'avoir été initialisé. De mauvaises choses vont arriver.
@Jerrycoffin Je ne suis pas sûr de voir la raison de la double affectation dans si (char ch = 0 || ((ch = getchar ()) == 0x1)) code>.
si (char ch = 0 || (getchar () == 0x1)) code> soit équivalent? Et pendant que nous sommes à elle ...
si (char ch = (getchar () == 0x1)) code> est toujours la même logique, seulement plus lisible ;-)
Vous pouvez abuser du
pour code> boucle.
S'il s'agit de la pollution, vous pouvez toujours utiliser une nouvelle portée ou la boucle pour la boucle.
La solution la plus succincte (stupide) est probablement
si (int c = getc (stdin) - 1); sinon nongetc (C + 1); code>.
Pourquoi cette limitation de ne pas soulever la définition variable et l'initialisation de la condition?
@Gmannickg Feng Shui?
@Slaks: Cela doit être le plus gros abus que j'ai entendu depuis un moment, ce qui est néanmoins une idée aussi fraîche que je suis presque tentée de trouver un endroit i> pour l'utiliser.
pour (char c = getc (stdin); c == 0x01;) {...} code> - Pas précisément print-de-de-lafusion, mais génial :-) Sauf ... comment Est-ce qu'il quitte, jamais?
@Damon remplir la dernière partie:
pour (char c = getc (stdin); c == 0x01; c = 42) code>
@Potatoswatter: ah droite, bien sûr :-)
duplicaté possible de Comment est-ce que l'on déclare une variable à l'intérieur d'un si () déclaration?