Вопрос об определениях переменных в функциях - PullRequest
0 голосов
/ 02 апреля 2010

включает

main()
{
    int a;
    for(a=1; a<=4 && printf("%d ",a); a++)
    {
       int a;
       static int b=a;
       printf("%d ",(a++)-b);
    }  
    getchar();
    getchar(); 
}  

В этом коде распечатка: 1 0 2 1 3 2 4 3. Я понимаю, почему int a; part работает иначе, чем int a, который был определен вне функции for, и почему static int b; определяется только один раз с основным значением a; но почему часть (a ++) в printf влияет на значения a? Разве мы не переопределяем int a; каждый раз, когда запускается функция for? Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 02 апреля 2010

Внутренний a не определен, и поэтому компилятор может использовать любое значение, которое ему нравится. Значение, которое ему нравится, по-видимому, является текущим значением байтов, которые занимает «a». Во второй раз в цикле вы получаете совершенно новый inner-a, который, по совпадению, оказывается в том же месте, что и предыдущий inner-A, и принимает его значение.

Но это просто случайность - если бы это было проще сделать другим способом, компилятор мог бы (и мог бы по закону).

Обратите внимание, что значение a никогда не читается после второго a ++. Вполне возможно, что если вы включите оптимизацию, компилятор решит, что ему не нужно делать это приращение, и внутреннее значение a всегда будет равно нулю.

3 голосов
/ 02 апреля 2010

Вы не присваиваете значение внутреннему a, поэтому результат не определен.

Даже если вы измените свой код для присвоения чего-либо a, ваш код не сможет компилироваться, потому что вы пытаетесь присвоить переменную локальной статической переменной в этой строке:

static int b=a;

Выход компилятора:

test.c: In function `main':
test.c:9: error: initializer element is not constant
3 голосов
/ 02 апреля 2010

внутренняя переменная 'a' неинициализирована, поэтому ее значение технически не определено каждый раз в цикле.

...