Ставит ли компилятор неявные фигурные скобки в if()?

Подставляет ли компилятор неявно фигурные скобки в:

if(true)
   int a = 1;

Ибо если мы позже попытаемся вывести значение переменной а, то мы этого сделать не сможем. Складывается такое впечатление, что там стоят фигурные скобки которые ограничивают область видимости этой переменной


Ответы (1 шт):

Автор решения: AlexGlebe

Возьмём подробнее пространства переменных для команды 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 и обязательно будет вызван деструктор в конце этой ветки условия.

→ Ссылка