2010-04-01 2 views
0

включают

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

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

+0

Требуется 'домашнее задание'? –

+0

@ все редакторы: не очень хорошо, когда слишком много редактируются одновременно;) –

+0

Это не домашнее задание. Я изучаю C головоломки для национального соревнования. –

ответ

3

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

+0

Я знаю, что он неинициализирован, но я вижу, что неинициализированное значение a увеличивается с ++ в функции printf. Это из-за моего компилятора или на языке C++, чтобы изменить значение «uninitialization»? –

+0

См. Ответ Джеймса. Это точно. – JayM

3

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

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

static int b=a; 

выход Составитель:

test.c: In function `main': 
test.c:9: error: initializer element is not constant 
+0

Вау, я даже не понял, что это было неверно в C. Еще одна причина использовать C++, даже если вы используете только C-стиль. –

4

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

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

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

Смежные вопросы