Ставит ли компилятор неявные фигурные скобки в if()?
Подставляет ли компилятор неявно фигурные скобки в:
if(true)
int a = 1;
Ибо если мы позже попытаемся вывести значение переменной а, то мы этого сделать не сможем. Складывается такое впечатление, что там стоят фигурные скобки которые ограничивают область видимости этой переменной
Ответы (1 шт):
Возьмём подробнее пространства переменных для команды if :
{ int a = 1 ;
int b = 0 ;
if ( int a = 2 ) {
int b = a + 1 ; }
else {
int b = a - 1 ; } }
Область действия переменной a в условии создаётся новой. И похожа на такое :
{ int a = 1 ;
int b = 0 ;
// область действия второй переменой a
{ int a = 2 ;
if ( a ) {
int b = a + 1 ; } // a == 2 , b == 3
else {
int b = a - 1 ; } } // a == 2 , b == 1
// область действия второй переменой a
}
Единственная проблема это дествие переменной a в условии. Область её действия работает как в успешном условии так и в отрицательном. И вторую копию переменной a определить нельзя.
{ int a = 1 ;
int b = 0 ;
if ( int a = 2 ) {
int a ; // error : redeclaration
int b = a + 1 ; }
else {
int a ; // error : redeclaration
int b = a - 1 ; } }
При объявлении переменной при каком-то условии эта переменная имеет область действия только в данном участке.
{ int a = 1 ;
int b = 0 ;
// b == 0
if ( int a = 2 ) {
int b = a + 1 ; } // b == 3
else {
int b = a - 1 ; } // b == 1
// b == 0
}
Переменные b все три разные, и так как объявление переменной это одно выражение, то фигурные скобки можно опускать. Действие будет аналогиное. Будут три разных переменных b.
{ int a = 1 ;
int b = 0 ;
// b == 0
if ( int a = 2 )
int b = a + 1 ; // b == 3
else
int b = a - 1 ; // b == 1
// b == 0
}
Взято из https://en.cppreference.com/w/cpp/language/if#Notes
ответ :
Видимости переменной, объявленной в успешной ветке не будет в негативной ветке, так как не будет вызван конструктор этой переменной.
Видимости переменной, объявленной в успешной ветке не будет после окончании конструкции if, так-как при негативном условии не будет вызван конструктор.
Из-за чёткого правила, что переменная должна быть с вызванным конструктором и деструктором вытекает такой порядок их вызовов :
{ int a = 1 ; конструктор a I
int b = 0 ; конструктор b I
{ int a = 2 ; конструктор a II
if ( a ) {
int b = a + 1 ; конструктор b II
деструктор b II
}
else {
int b = a - 1 ; конструктор b III
деструктор b III
}
деструктор a II
}
деструктор b I
деструктор a I
}
Условного объявления переменной a нет.
if(true)
int a = 1;
Она будет однозначно объявлена только при выполнении условия true и обязательно будет вызван деструктор в конце этой ветки условия.