Was ist denn hier los?
if(int a = Func1())
{
// Works.
}
if((int a = Func1()))
{
// Fails to compile.
}
if((int a = Func1())
&& (int b = Func2()))
)
{
// Do stuff with a and b.
// This is what I'd really like to be able to do.
}
In Abschnitt 6.4.3 des Standards von 2003 wird erläutert, wie Variablen, die in einer Auswahlanweisungsbedingung deklariert sind, einen Bereich haben, der sich bis zum Ende der von der Bedingung gesteuerten Unteranweisungen erstreckt. Aber ich sehe nicht, wo es etwas darüber aussagt, dass die Deklaration nicht in Klammern gesetzt werden kann, und es sagt auch nichts über nur eine Deklaration pro Bedingung aus.
Diese Einschränkung ist selbst in Fällen ärgerlich, in denen nur eine Erklärung in der Bedingung erforderlich ist. Bedenken Sie.
bool a = false, b = true;
if(bool x = a || b)
{
}
Wenn ich den 'if "-Körperbereich eingeben möchte, wobei x auf false gesetzt ist, benötigt die Deklaration Klammern (da der Zuweisungsoperator eine niedrigere Priorität als das logische ODER hat), aber da Klammern nicht verwendet werden können, muss x außerhalb deklariert werden Der Körper verliert diese Deklaration an einen größeren Umfang als gewünscht. Offensichtlich ist dieses Beispiel trivial, aber ein realistischerer Fall wäre einer, bei dem a und b Funktionen sind, die Werte zurückgeben, die getestet werden müssen
Entspricht das, was ich tun möchte, nicht dem Standard, oder sprengt mein Compiler nur meine Bälle (VS2008)?
while
sind die gleichen wie für if
.
if (int a = foo(), int b = bar(), a && b)
? Wenn der Kommaoperator nicht überladen ist, gibt der Standard an, dass die Ausdrücke von links nach rechts ausgewertet werden und der Ergebniswert der letzte Ausdruck ist. Es funktioniert mit for
Schleifeninitialisierung, warum nicht hier?
if
, und es scheint eine falsche Annahme zu sein.
if
.if
ist keine Schleife, es ist eine Bedingung.