Функции и структура на програмата - 2

Chapter 4 - Functions and Program Structure
4.6 Static Variables
4.7 Register Variables
4.8 Block Structure
4.9 Initialization
4.10 Recursion
4.11 The C Preprocessor
4.11.1 File Inclusion
4.11.2 Macro Substitution
4.11.3 Conditional Inclusion

Статични променливи
Автоматични (външни) променливи - видими само във файла, където за дефинирани.
Локални (вътрешни) променливи - запазват стойността си при повторно викане на функцията.

static char buf[BUFSIZE]; /* buffer for ungetch */
static int bufp = 0; /* next free position in buf */

int getch(void)
{ ... }

void ungetch(int c)
{ ... }


Пример:

Register променливи

Брзи променливи
register int x;
register char c;


int f(register unsigned m, register long n)
{

    register int i;
    ...
}


Блокова структура

Дефиниране на променливи, локални за блок.
if (n > 0) {
    int i; /* declare a new i */
    for (i = 0; i < n; i++) ...
}


Пример:

Инициализация

Задаване на начална стойност на променливи.
int x = 1;
char squota = '\'';
long day = 1000L * 60L * 60L * 24L; /* milliseconds/day */
int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }


Рекурсия

/* qsort: sort v[left]...v[right] into increasing order */
void qsort(int v[], int left, int right)

{
    int i, last;
    void swap(int v[],
int i, int j);

    if (left >= right)
/* do nothing if array contains */
        return;        /* fewer than two elements */
    swap(v, left, (left + right)/2); /* move partition elem */
    last = left; /* to v[0] */
    for (i = left + 1; i <= right; i++) /* partition */
        if (v[i] < v[left])
            swap(v, ++last, i);

    swap(v, left, last);   
/* restore partition elem */
    qsort(v, left, last-1);
    qsort(v, last+1, right);


}


/* swap: interchange v[i] and v[j] */
void swap(int v[], int i, int j)

{
    int temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}



Препроцесорът на С

   Включване на файлове

#include "filename"
 or
#include <filename>


   Замяна на макроси

#define square(x) x * x    /* WRONG */
square(z+1)

Пример:

   Условно включване

#if !defined(HDR)
#define HDR

/* contents of hdr.h go here */

#endif


Пример: