Is there a way to declare, assign and compare a variable to an expression in an if construction in such a way that it is only defined in the scope of the if construction?
You can only do a declaration OR boolean logic in an if
statement. The C++ spec says so somewhere, forgot where exactly. Therefore a code like:
if (int x = 3 && x == 3) {}
will never compile because it will also throw the error that x
is used uninitialized
You can declare the variable in the if
, but if you do so, the
condition depends on the implicit conversion of the type to
bool
, which is very limiting and a bit obfuscating. The
definition in the for
works because the first part of the
for
isn't part of the condition. Just write:
int i = f();
if ( i == 3 ) {
// ...
} else {
// ...
}
This leaves the variable in scope until the end of the enclosing block, but the enclosing block can't be bigger than the entire function; if leaving it in scope is a problem, then your functions are too large and complex, and need to be refactored.
As far as I can tell there is no way to have both a declaration and an expression within the condition of an if statement. If we look at the draft C++ standard section 6.4
Selection statements the grammar for if is as follows:
selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement
condition:
expression
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list
So you either can use an expression or a declaration and I don't see any obvious ways around that.
What you proposed in the alternative, declaring i
before the if statement seems like the best option. Although using an enclosing block does not seem necessary:
int i = f();
if(i == 3)
The first snippet works because you are declaring and defining i
in if
's conditional expression. It will always evaluated to true
.
The second snippet does not compile because you are comparing a non-primary (because i
is declared and defined here) expression in conditional expression with a primary expression.