Что делает ++ cc [c] в «Языке программирования C» (второе издание) упражнения 1–14 «Функция гистограммы»? - PullRequest
0 голосов
/ 05 июля 2019

У меня возникли проблемы с пониманием действительной функции ++cc[c] в гистограмме do, код показан ниже:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXHIST 15
#define MAXCHAR 128

/*print horizontal histogram freq. of different char*/
int main()
{
    int c, i;
    int len;
    int maxvalue;
    int cc[MAXCHAR];

    for (i = 0; i < MAXCHAR; ++i)
        cc[i] = 0;
    while ((c = getchar()) != EOF)
        if (c < MAXCHAR)
            ++cc[c];
    maxvalue = 0;
    for (i = 1; i < MAXCHAR; ++i)
        if( cc[i] > maxvalue)
            maxvalue = cc[i];

    for (i = 1; i < MAXCHAR; ++i) {
        if (isprint(i))
            printf("%5d - %c - %5d : ", i, i, cc[i]);
        else
            printf("%5d -   - %5d : ", i, cc[i]);
        if (cc[i] > 0) {
            if ((len = cc[i] * MAXHIST / maxvalue) <= 0)
                len = 1;
        } else
            len = 0;
        while (len > 0) {
            putchar('*');
            --len;
        }
        putchar('\n');
    }
}

Я понимаю, как cc[i] = 0 работает, однако я не знаю, какова функция ++cc[c] do и как она взаимодействует с cc[i].

1 Ответ

2 голосов
/ 05 июля 2019

Приоритет оператора говорит о том, что сначала применяются скобки [], а затем оператор приращения ++, используемый в качестве префикса, т.е. ++cc[c] анализируется как ++(cc[c]).

Действительно, в этом контексте я бы предпочел использовать cc[c]++;, так как будет легко разобрать без двусмысленности, даже не зная приоритета.

Что cc[c]++ или ++cc[c] делает для увеличенияc-й элемент в массиве, на который указывает cc единица.Эти две формы различаются по значению выражения , первое значение оценивается как значение до увеличения , а второе - до значения после увеличения .Значение выражения игнорируется здесь, поскольку оно вычисляется как выражение void в выражении выражения, и поэтому вы можете использовать любую форму.


Первый for цикл с использованием i обнуляет каждый элемент в массиве счетчиков символов (cc).Этот цикл на самом деле не нужен, если массив инициализируется нулями: просто запись

int cc[MAXCHAR] = {0};

обнулит каждый элемент в массиве cc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...