Путаница, связанная с авто и статическими переменными

#include<stdio.h>
int main(){
int a=10;
{    printf("%d",a);
int a=20;
printf("%d",a);
}
printf(" %d",a);
return 0;
}

Output:10 20 10

В приведенном выше коде я понимаю, что видимость переменной a (внутри внутреннего блока) имеет область видимости только внутри этого блока, поэтому я получаю этот конкретный вывод.
Но переменная a, которая объявлена ​​вне этого блока, должна иметь свою область видимости даже внутри внутреннего блока … Поэтому, как я могу снова набрать int a=20;
Не должно ли это дать мне ошибку типа «переопределение a» и «предыдущее объявление a было здесь». Например, если я использую

int b=10;
int b=15;

Моя вторая проблема заключается в следующем

void main() {
static int a=10;

{
printf("%d ",a);
static int a=20;
printf("%d",a);
}
printf(" %d",a);

}

Помимо тех же сомнений, что и в предыдущем коде о том, почему я не получаю ошибку типа «переопределение a», это мое сомнение, связанное с этим кодом.

Для приведенного выше кода я получаю то же самое Output: 10 20 10 но я ожидал

10 20 20

Я имею в виду во внутреннем блоке, когда static int a повторно инициализируется до 20, не должно ли оно быть тем же значением даже после выхода из блока? потому что область действия статической переменной распространяется на всю программу.

-1

Решение

Ответ на первую проблему: это называется изменением теней. Из Википедии:

Затенение переменной происходит, когда переменная объявлена ​​в определенном
область (блок решений, метод или внутренний класс) имеет то же имя, что и
переменная объявлена ​​во внешней области видимости.

Проще говоря, когда вы создаете переменную с тем же именем, но в другой области видимости, она затеняет предыдущую переменную.

По поводу второй проблемы — вот прекрасный пример:

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
static int nStatic;    // Value of nStatic is retained
// between each function call
nStatic += curr;
cout << "nStatic is " << nStatic << endl;
}

int main() {
for ( int i = 0; i < 5; i++ )
showstat( i );
}

Выход:

nStatic равен 0

nStatic равен 1

nStatic — это 3

nStatic — 6

nStatic — 10

2

Другие решения

#include<stdio.h>
int main(){
int a=10;
{    printf("%d",a);
int a=20;
printf("%d",a);
}
printf(" %d",a);
return 0;
}

Второй a в другой сфере, как вы, кажется, уже поняли. Ошибка «переопределение» применяется только тогда, когда вы определяете две переменные с одинаковым именем в том же объеме.

void main() {
static int a=10;

{
printf("%d ",a);
static int a=20;
printf("%d",a);
}
printf(" %d",a);

}

Опять же, a внутри внутреннего блока имеет только область видимости в этом блоке. Если вы снова введете тот же блок, a будет продолжать иметь то же значение, потому что вы объявили его как static, Однако за пределами блока вы будете использовать значение первой переменной a, Это иллюстрирует разницу между переменной объем И его продолжительность жизни.

1

По вопросам рекламы [email protected]