Главная страница
Навигация по странице:

  • Перечислимые типы ДалееСодержаниеКлючевое слово enum

  • ПРИМЕНЕНИЕ Основная причина использования типа enum

  • Язык Си Приложения

  • Язык Си - Уэйт, Прата, Мартин. M. уэит с. Прата д. Мартин


    Скачать 4.69 Mb.
    НазваниеM. уэит с. Прата д. Мартин
    АнкорЯзык Си - Уэйт, Прата, Мартин.pdf
    Дата15.03.2018
    Размер4.69 Mb.
    Формат файлаpdf
    Имя файлаЯзык Си - Уэйт, Прата, Мартин.pdf
    ТипПрограмма
    #16711
    страница42 из 42
    1   ...   34   35   36   37   38   39   40   41   42

    Структуры в качестве аргументов функции
    Далее
    Содержание
    В нерасширенном языке Си можно передавать функции адрес структуры. Например, если montana
    является структурной переменной структурного типа player, мы можем обратиться к функции следующим образом:
    stats(&montana);
    Функция stats( ) будет иметь примерно такой заголовок:
    stat(name) struct player * name;
    После вызова функции указатель name будет ссылаться на структуру montana и функция будет использовать montana в своих манипуляциях.
    В расширенном языке Си мы можем применять имя самой структуры в качестве аргумента, и это приведет к созданию копии исходной структуры в составе вызванной функции. Например,
    обращение к той или иной функции может выглядеть примерно так:
    stats(montana);
    Теперь функция stats( ) должна иметь несколько иной заголовок:
    stats(name) struct player name;
    На этот раз после вызова функции создается новая структурная переменная типа player. Новая переменная получает название name, и каждый элемент name имеет такое же значение, как и соответствующий элемент структуры montana.
    338


    Это расширение позволяет функции иметь свою "личную" копию структуры точно так же, как она обычно имеет свои копии стандартных переменных. Преимущество здесь то же, что и раньше:
    структуры не изменяются необъяснимо из-за непредвиденного побочного воздействия функции.
    Будьте осторожны: Некоторые компиляторы допускают обращение вида stats(montana);
    но на самом деле интерпретируют его как stats(&montana);
    В этом случае передается адрес, и функция работает с самой исходной структурной переменной, а не с ее копией.
    Перечислимые типы
    Далее
    Содержание
    Ключевое слово enum позволяет создавать новый тип и определять значения, которые он может иметь. Приведем пример:
    enum spectrum (red, orange, yellow, green, blue, violet);
    enum spectrum color;
    Первый оператор объявляет новый тип: spectrum. Он перечисляет также возможные значения переменных типа spectrum: red, orange и т. д. Они являются константами типа spectrum так же,
    как 4 является константой типа int, a 'g' - константой типа char.
    Второй оператор объявляет color переменной типа spectrum. Вы можете присвоить переменной
    color любую константу типа spectrum; например:
    color = green;
    На первый взгляд типы enum могут показаться похожими на определенные пользователем порядковые типы языка Паскаль. Действительно, сходство есть, но есть и существенные различия,
    поэтому, если вы знаете Паскаль, то нс придете к такому заключению.
    Рассмотрим характер этих новых констант и операций, которые можно выполнять с использованием переменных типа
    enum константы
    Как компьютер запоминает что-нибудь подобное red? Он может рассматривать это как символьную строку, но у нее нет кавычек. И действительно, red и другие enum константы запоминаются как целые числа. Например, попробуйте выполнить printf("red = %d, orange = %d\n", red, orange);
    и с учетом вышеуказанных описании вы получите такой результат:
    red = 0, orange = 1
    По существу переменная red и ее "сестры" действуют как синонимы целых чисел от 0 до 5.
    Результат подобен использованию
    #define red 0
    за исключением того, что соответствие, установленное при помощи оператора enum более ограниченно. Например, если index является переменной типа int, то оба нижеследующих
    339
    оператора недопустимы:
    index = blue; /* несоответствие типа */
    color = 3; /* несоответствие типа */
    Позже мы рассмотрим другие ограничения при использовании констант и переменных типа enum.
    Сначала более внимательно рассмотрим значения констант типа enum.
    Значения по умолчанию
    Наш пример проиллюстрировал присваивание константам значений по умолчанию. Константам,
    появляющимся в описании enum, присваиваются целые числа 0, 1, 2 и т. д. в порядке их расположения. Так, описание enum kids {nippy, slats, skip, nana, liz};
    присваивает nаnа значение 3.
    Присвоенные значения
    Можно выбирать значения, которые вы хотите присвоить константам, но они должны быть целого типа (включая char). Для этого включите желаемыe значения в описание:
    enum levels {low = 100, medium = 500, high = 2000};
    Если вы присваиваете какое-либо значение одной константе и не присваиваете ничего константам,
    следующим за ней, то им будут присвоены последовательные значения, идущие за явно присвоенным значением. Например,
    enum feline {cat = 20, tiger, lion, puma};
    присваивает переменной tiger значение 21, переменной lion - значение 22 и puma - значение 23.
    Операции
    Теперь рассмотрим, что можно и нельзя делать с величинами типа enum.
    Вы можете присвоить константу типа enum переменной того же типа enum feline pet;
    pet = tiger;
    Нельзя использовать другие операции присваивания:
    pet += cat; /* недопустимо */
    Можно провести сравнение с целью выявления равенства или неравенства:
    if ( per = = cat) ...
    if ( color ! = violet)
    Нельзя использовать другие операции отношения:
    if(color > yellow) /* недопустимо */
    Можно применять арифметические операции к константам типа enum:
    color = red + blue;
    pet = puma * lion;
    Имеют ли такие выражения какой-то смысл - это уже другой вопрос.
    340

    Нельзя использовать арифметическиe операции для переменных типа enum:
    color = color + green; /* недопустимо */
    Нельзя использовать операции yвеличения и уменьшения:
    color++ ; /* недопустимо */
    Нельзя использовать константу типа enum для индекса массива:
    marbles[red] = 23; /* недопустимо */
    ПРИМЕНЕНИЕ
    Основная причина использования типа enum заключается в улучшении читаемости программ. Если вы имеете дело с некоторым видом цветовых кодов, то использование red и blue что обычно типы enum предназначены для использования внутри программы, а не для ввода-вывода. Например,
    если вы хотите ввести значение для переменной color типа spectrum, то должны были бы ввести,
    скажем, целое число 1, а не слово orange. (Конечно, можно было бы создать функцию ввода,
    которая восприняла бы строку "orange" и затем преобразовала бы ее в целое число orange.)
    ПРИЛОЖЕНИЕ К
    ТАБЛИЦА КОДОВ ASCII
    Числовые преобразования
    Числовые преобразования десятичное - шестнадцатеричное - восьмеричное - двоичное - ASCII
    Десяте- ричное
    X
    10
    Шестнад- цатеричное
    X
    16
    Восьме ричное
    X
    8
    Двоичное
    PX
    x
    ASCII
    Ключ*
    0 1
    2 3
    4 5
    6 00 01 02 03 04 05 06 00 01 02 03 04 05 06 00000000 10000001 10000010 00000011 10000100 00000101 00000110
    NUL
    SOH
    STX
    ЕТХ
    EOT
    ENQ
    АСК
    CTRL/I
    CTRL/A
    CTRL/B
    CTRL/C
    CTRL/D
    CTRL/E
    CTRL/F
    7 8
    9 07 08 09 07 10 11 10000111 10001000 00001001
    BEL
    BS
    HT
    CTRL/G
    СTRL/H,возврат
    CTRL/I,табуляция
    341

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 0А
    0B

    0D
    0E
    0F
    10 11 12 13 14 15 16 17 18 19 1A
    1B

    1D
    1E
    1F
    20 21 22 23 24 25 26 27 12 13 14 15 16 17 20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37 40 41 42 43 44 45 46 47 00001010 10001011 00001100 10001101 10001110 00001111 10010000 00010001 00010010 10010011 00010100 10010101 10010110 00010111 00011000 10011001 10011010 00011011 10011100 00011101 00011110 10011111 10100000 00100001 00100010 10100011 00100100 10100101 10100110 00100111
    LF
    VT
    FF
    CR
    SO
    SI
    DLE
    C1
    DC2
    DC3
    DC4
    NAK
    SYN
    TB
    CAN
    EM
    SUB
    ESC
    FS
    GS
    RS
    US
    SP
    !
    "
    #
    $
    ½
    &
    '
    CTRL/J,новая строка
    CTRL/K
    CTRL/L
    CTRL/M,возврат
    CTRL/N
    CTRL/O
    CTRL/P
    CTRL/Q
    CTRL/R
    CTRL/S
    CTRL/T
    CTRL/U
    CTRL/V
    CTRL/W
    CTRL/X
    CTRL/Y
    CTRL/Z
    ESC,возврат
    СТRL<
    CTRL/
    CTRL/=
    СTRL/-
    Пробел
    !
    "
    #
    $
    ½
    &
    '
    342

    40 41 42 43 44 45 46 47 48 49 50 51 52 28 29 2А


    2D

    2F
    30 31 32 33 34 50 51 52 53 54 55 56 57 60 61 62 63 64 00101000 10101001 10101010 00101011 10101100 00101101 00101110 10101111 00110000 10110001 10110010 00110011 10110100
    (
    )
    *
    +
    '
    -
    /
    0 1
    2 3
    4
    (
    )
    *
    +
    '
    -
    /
    0 1
    2 3
    4 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 35 36 37 38 39 3А


    3D

    3F
    40 41 42 43 44 45 46 65 66 67 70 71 72 73 74 75 76 77 100 101 102 103 104 105 106 00110101 00110110 10110111 10111000 00111001 00111010 10111011 00111100 10111101 10111110 00111111 11000000 01000001 01000010 11000011 01000100 11000101 11000110 5
    6 7
    8 9
    :
    ;
    <
    =
    >
    ?
    @
    А
    в с
    D
    Е
    F
    5 6
    7 8
    9
    :
    ;
    <
    =
    >
    ?
    @
    А
    в с
    D
    Е
    F
    343

    71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 47 48 49 4A


    4D

    4F
    50 51 52 53 53 55 56 57 58 59 5А


    5D

    5F
    60 61 62 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 140 141 142 01000111 01001000 11001001 11001010 01001011 11001100 01001101 01001110 11001111 01010000 11010001 11010010 01010011 11010100 01010101 01010110 11010111 11011000 01011001 01011010 11011011 01011100 11011101 11011110 01011111 01100000 11100001 11100010
    G
    н
    I
    J
    к
    L
    M
    N
    0
    P
    Q
    R
    S
    T
    U
    V
    W
    X
    Y
    Z
    [
    /
    ]
    ^
    - a
    b
    G
    Н
    I
    J
    К
    L
    M
    N
    0
    Р
    Q
    R
    S
    Т
    U
    V
    W
    X
    Y
    Z
    [
    /
    ]
    ^
    - a
    b
    99 100 63 64 143 144 01100011 11100100
    с d
    c d
    344

    101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 65 66 67 68 69 6А


    6D

    6F
    70 71 72 73 74 75 76 77 78 79 7A
    7B

    7D

    7F
    145 146 147 150 151 152 153 154 155 156 157 160 161 162 163 164 165 166 167 170 171 172 173 174 175 176 177 01100101 01100110 11100111 11101000 01101001 01101010 11101011 01101100 11101101 11101110 01101111 11110000 01110001 01110010 11110011 01110100 11110101 11110110 01110111 01111000 11111001 11111010 01111011 11111100 01111101 01111110 11111111
    е f
    g h
    i j
    k l
    m n
    o p
    q r
    s t
    u v
    w x
    y z
    R
    /
    T

    DEL
    е f
    g h
    I
    j k
    1
    m n
    о p
    q r
    s t
    u v
    w x
    y z
    R
    /
    T

    DEL,отмена символа
    [Содержание]
    [Вверх]
    Язык Си
    Приложения
    345
    1   ...   34   35   36   37   38   39   40   41   42


    написать администратору сайта