#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, не должно ли оно быть тем же значением даже после выхода из блока? потому что область действия статической переменной распространяется на всю программу.
Ответ на первую проблему: это называется изменением теней. Из Википедии:
Затенение переменной происходит, когда переменная объявлена в определенном
область (блок решений, метод или внутренний класс) имеет то же имя, что и
переменная объявлена во внешней области видимости.
Проще говоря, когда вы создаете переменную с тем же именем, но в другой области видимости, она затеняет предыдущую переменную.
По поводу второй проблемы — вот прекрасный пример:
// 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
#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
, Это иллюстрирует разницу между переменной объем И его продолжительность жизни.