int i=1; | i.0=1. |
main() { | |
auto int i, j; | Переменные i.1 и j.1 определяются, но значений у них нет. |
i.1=reset(); | В качестве значения i. 1 получает результат, возвращаемый reset. |
reset() { | |
return(i.0); | Поскольку reset не имеет параметров и локальных переменных с именем i, то появление i относится к i.0. Функция reset выдает 1, так что i.1=1. |
} | |
for ( j.1=1; j.1<=3; j.1++ ) { | j.1=1. |
PRINT2(d,i.1,j.1); PRINT1(d,next(i.1)); int next(1) | |
{ (int i=1;) | j.next=1. |
return( j.next=i.0++ ); | i.0=2, но next выдает 1, так как операция увеличения выполняется после того, как будет взято значение i.0. Оператор возврата ссылается на i.0, так как в next нет других переменных с именем i. После выполнения оператора возврата j.next исчезает. |
} PRINT1(d,last(i.1)); int last(1) | |
{(int j=1;) | j.last=1. |
static int i=10; | i.last=10. В last есть своя переменная с именем i, инициируемая значением 10. Класс памяти i - static, а это означает, что i инициируется при загрузке программы и исчезает, когда программа заканчивается. |
return(j.last=i.last--); | Переменная i.last=9, но выдается значение 10, так как уменьшение переменной происходит после использования ее значения. После возврата j.last исчезает, но i.last остается, и когда вновь обращаемся к last, то i будет равно 9. |
} PRINT1(d,new(i.1+j.1)); int new(2) | |
{(int i=2;) | i.new=2. |
int j=10; | j.new=10. |
return(i.new=j.new+=i.new); | j.new=12, i.new=12 и выдается значение 12. |
} | После возврата j.new и i.new исчезают. |
for ( j.1=1; j.1<=3; j.1++ ) { | j.1=2. Возвращаемся к оператору for. Для этого шага опишем в общих чертах действие каждого оператора. |
PRINT2(d,i.1,j.1); | Выполнение тела цикла приводит к увеличению j.1 на 1, но значение i.1 не меняется. |
PRINT1(d,next(i.1)); | Функция next игнорирует значение передаваемого параметра и возвращает текущее значение i.0. Побочным эффектом выполнения next будет увеличение i.0 на 1. |
PRINT1(d,last(i.1)); | Функция last также игнорирует значение передаваемого параметра. Выдается текущее значение локальной статической переменной i.last. Побочный эффект выполнения last - уменьшение i.last на 1. |
PRINT1(d,new(i.1+j.1)); | Функция new выдает значение своего параметра плюс 10. Побочных эффектов нет. |
} } |