Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 24

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

Π’ Ρ„Π°ΠΉΠ»Π΅ 1:


extern int sp;

extern double val[];


void push(double f) {…}

double pop(void) {…}


Π’ Ρ„Π°ΠΉΠ»Π΅2:


int sp = 0;

double val[MAXVAL];

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ объявлСния extern находятся Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π°1 ΠΈ Π²Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΡ… дСйствиС распространяСтся Π½Π° всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° объявлСний достаточно для всСго Ρ„Π°ΠΉΠ»Π°1. Π’Π° ΠΆΠ΅ организация extern-объявлСний Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΈ Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ опрСдСлСния sp ΠΈ val располоТСны послС ΠΈΡ… использования.

4.5 Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим сСбС, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΈΠΌΠ΅ΡŽΡ‚ сущСствСнно большиС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹, ΠΈ зададимся вопросом, ΠΊΠ°ΠΊ Π² этом случаС Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎ нСскольким Ρ„Π°ΠΉΠ»Π°ΠΌ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ main помСстим Π² Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π°Π·ΠΎΠ²Π΅ΠΌ main.с; push, pop ΠΈ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ располоТим Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, stack.с; a getop - Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ, getop.c. НаконСц, getch ΠΈ ungetch размСстим Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ getch.с; ΠΌΡ‹ ΠΎΡ‚Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈΡ… ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· Π·Π°Ρ€Π°Π½Π΅Π΅ скомпилированной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

БущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСдуСт ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ читатСля, - опрСдСлСния ΠΈ объявлСния совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ нСсколькими Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. ΠœΡ‹ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти объявлСния ΠΈ опрСдСлСния Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для Π½ΠΈΡ… сущСствовала Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° копия. Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² процСссС Π΅Π΅ развития Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³Ρ‡Π΅ ΠΈ ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ состоянии. Для этого ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ располоТим Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ calc.h, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹. (Π‘Ρ‚Ρ€ΠΎΠΊΠ° #include описываСтся Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 4.11) Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, файловая структура ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½ΠΈΠΆΠ΅:

main.с:

#include β€Ήstdio.hβ€Ί

#include β€Ήstdlib.hβ€Ί

#include "calc.h"

#define MAXOP 100

main() {

 β€¦

}


calc.h:

#define NUMBER '0'

void push(double);

double pop(void);

int getop(char[]);

int getch(void);

void ungetch(int);


getop.c:

#include β€Ήstdio.hβ€Ί

#include β€Ήctype.hβ€Ί

#include "calc.h"

getop (){

 β€¦

}


getch.c:

#include β€Ήstdio.hβ€Ί

#define BUFSIZE 100

char buf[BUFSIZE];

intbufp = 0;

int getch(void) {

 β€¦

}

void ungetch(int) {

 β€¦

}


stack.с:

#include β€Ήstdio.hβ€Ί

#include "calc.h"

#define MAXVAL 100

int sp = 0;

double val[MAXVAL];

void push(double) {

 β€¦

}

double pop(void) {

 β€¦

}

НСизбСТСн компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ стрСмлСниСм, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π²Π»Π°Π΄Π΅Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, которая Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с большим количСством Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² довольно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΡ… Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ срСднСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, вСроятно, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ собраны вмСстС всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…; Ρ‚Π°ΠΊ ΠΌΡ‹ здСсь ΠΈ поступили. Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² потрСбуСтся Π±ΠΎΠ»Π΅Π΅ слоТная организация с большим числом Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

4.6 БтатичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ sp ΠΈ val Π² Ρ„Π°ΠΉΠ»Π΅ stack.с, Π° Ρ‚Π°ΠΊΠΆΠ΅ buf ΠΈ bufp Π² getch.с находятся Π² Π»ΠΈΡ‡Π½ΠΎΠΌ пользовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ этих Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ Π½Π΅Ρ‚ смысла ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅. Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ static, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ ΠΊ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ способ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π°. Π’Π°ΠΊ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ buf ΠΈ bufp Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ внСшними, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getch ΠΈ ungetch, Π½ΠΎ ΠΈΡ… слСдуСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для "ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ" Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ getch ΠΈ ungetch.

БтатичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ спСцифицируСтся словом static, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ помСщаСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ объявлСниСм. Если рассматриваСмыС Π½Π°ΠΌΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΊΠ°ΠΊ Π² ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

static char buf[BUFSIZE]; /* Π±ΡƒΡ„Π΅Ρ€ для ungetch */

static int bufp = 0; /* слСд. свободная позиция Π² buf */


int getch(void) {…}


void ungetch(int с) {…}

Ρ‚ΠΎ никакая другая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ Π½ΠΈ ΠΊ buf, Π½ΠΈ ΠΊ bufp, ΠΈ этими ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ свободно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… для совсСм ΠΈΠ½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, помСщая ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ static ΠΏΠ΅Ρ€Π΅Π΄ объявлСниями ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… sp ΠΈ val, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ push ΠΈ pop, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈΡ… ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ static Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½ΠΎ с Ρ€Π°Π²Π½Ρ‹ΠΌ успСхом Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ ΠΊ функциям. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ ΠΈ Π²ΠΈΠ΄ΠΈΠΌΡ‹ ΠΈΠ· любого мСста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если ΠΆΠ΅ функция ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° словом static, Ρ‚ΠΎ Π΅Π΅ имя становится Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ Π²Π½Π΅ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°.

ОбъявлСниС static ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Как ΠΈ автоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ Π² функциях, Π½ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ автоматичСских, ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ постоянно. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ постоянноС сохранСниС Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.11. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getop Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΠ°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ungetch. Подсказка: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.

4.7 РСгистровыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ОбъявлСниС register сообщаСт компилятору, Ρ‡Ρ‚ΠΎ данная пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ register, Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° рСгистрах ΠΌΠ°ΡˆΠΈΠ½Ρ‹, благодаря Ρ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, станСт Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΈ быстрой. Однако компилятор ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅. ОбъявлСниС register выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

register int Ρ…;

register char с;

ΠΈ Ρ‚. Π΄. ОбъявлСниС register ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ автоматичСским ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для послСдних это выглядит Ρ‚Π°ΠΊ:

f(register unsigned m, register long n)

{

 register int i;

 β€¦

}

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ограничСния Π½Π° рСгистровыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ связано с возмоТностями Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Ρ‹. Π Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² рСгистрах ΠΌΠΎΠΆΠ΅Ρ‚ лишь нСбольшоС число ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ объявлСния register Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ рСгистров ΠΈΠ»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° рСгистрС. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ рСгистровой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹Π΄Π΅Π»Π΅Π½ Π½Π° самом Π΄Π΅Π»Π΅ для Π½Π΅Π΅ рСгистр ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ понятиС адрСса (см. Π³Π»Π°Π²Ρƒ 5). ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ограничСния Π½Π° количСство ΠΈ Ρ‚ΠΈΠΏΡ‹ рСгистровых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… зависят ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

4.8 Блочная структура

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π‘ΠΈ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ½ Π½Π΅ являСтся языком, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ Π±Π»ΠΎΡ‡Π½ΡƒΡŽ структуру ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ‚ΠΎΠΌ смыслС, ΠΊΠ°ΠΊ это допускаСтся Π² ПаскалС ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π΅ΠΌΡƒ языках. Но ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π² Π±Π»ΠΎΡ‡Π½ΠΎ-структурной ΠΌΠ°Π½Π΅Ρ€Π΅. ОбъявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (вмСстС с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ) Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ ΠΈ послС любой Π»Π΅Π²ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ, описанная Ρ‚Π°ΠΊΠΈΠΌ способом, "затСняСт" ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, располоТСнныС Π² ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠ°Ρ…, ΠΈ сущСствуСт Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки. НапримСр, Π²

if (n β€Ί 0) {

 int i; /* описаниС Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i */

 for (i = 0; i β€Ή n; i++)

  …

}

ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i являСтся Π²Π΅Ρ‚Π²ΡŒ if, выполняСмая ΠΏΡ€ΠΈ nβ€Ί0; ΠΈ эта пСрСмСнная Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ i, располоТСнным Π²Π½Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚. АвтоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π² Π±Π»ΠΎΠΊΠ΅, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ static ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ.

АвтоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ "Π·Π°Ρ‚Π΅Π½ΡΡŽΡ‚" внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. НапримСр, Π²

int x;

int y;

f(double Ρ…)

{

 double y;

}

x Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f рассматриваСтся ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° double, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π²Π½Π΅ f это внСшняя пСрСмСнная Ρ‚ΠΈΠΏΠ° int. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ y.