Информация об изменениях

Сообщение Re[5]: Arrays and Pointers от 20.09.2018 20:19

Изменено 20.09.2018 21:08 rg45

Re[5]: Arrays and Pointers
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, SergeCpp, Вы писали:

SC>>Старый добрый C FAQ:

S_B>Читаю. Вроде всё знаю, но некоторые вещи удивляют. Вот например функция, компилируется и работает:
S_B>void mystrcpy(const char * from, char * to, int count)
S_B>{
S_B>    assert(count > 0);

S_B>    int n = (count + 7) / 8;    /* count > 0 assumed */
S_B>    switch (count % 8)
S_B>    {
S_B>    case 0:    do {
S_B>                   *to++ = *from++;
S_B>    case 7:        *to++ = *from++;
S_B>    case 6:        *to++ = *from++;
S_B>    case 5:        *to++ = *from++;
S_B>    case 4:        *to++ = *from++;
S_B>    case 3:        *to++ = *from++;
S_B>    case 2:        *to++ = *from++;
S_B>    case 1:        *to++ = *from++;
S_B>                } while (--n > 0);
S_B>    }
S_B>}
S_B>


S_B>Никогда б не пришло в голову перемешивать цикл и switch.


Да здесь еще как-будто специально постарались сделать код как можно более запутанным. Например, спокойно можно было бы внести "case 0" внутрь цикла. Абсолютно то же самое, но так хоть мозг меньше наламывает.

    switch (count % 8)
    {
        do {
        
    case 0: std::cout << " " << count--;
    case 7: std::cout << " " << count--;
    case 6: std::cout << " " << count--;
    case 5: std::cout << " " << count--;
    case 4: std::cout << " " << count--;
    case 3: std::cout << " " << count--;
    case 2: std::cout << " " << count--;
    case 1: std::cout << " " << count--;
           } while (--n > 0);
    }
Re[5]: Arrays and Pointers
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, SergeCpp, Вы писали:

SC>>Старый добрый C FAQ:

S_B>Читаю. Вроде всё знаю, но некоторые вещи удивляют. Вот например функция, компилируется и работает:
S_B>void mystrcpy(const char * from, char * to, int count)
S_B>{
S_B>    assert(count > 0);

S_B>    int n = (count + 7) / 8;    /* count > 0 assumed */
S_B>    switch (count % 8)
S_B>    {
S_B>    case 0:    do {
S_B>                   *to++ = *from++;
S_B>    case 7:        *to++ = *from++;
S_B>    case 6:        *to++ = *from++;
S_B>    case 5:        *to++ = *from++;
S_B>    case 4:        *to++ = *from++;
S_B>    case 3:        *to++ = *from++;
S_B>    case 2:        *to++ = *from++;
S_B>    case 1:        *to++ = *from++;
S_B>                } while (--n > 0);
S_B>    }
S_B>}
S_B>


S_B>Никогда б не пришло в голову перемешивать цикл и switch.


Да здесь еще как-будто специально постарались сделать код как можно более запутанным. Например, спокойно можно было бы внести "case 0" внутрь цикла. Абсолютно то же самое, но так хоть мозг меньше наламывает.

    switch (count % 8)
    {
        do {
        
    case 0:        *to++ = *from++;
    case 7:        *to++ = *from++;
    case 6:        *to++ = *from++;
    case 5:        *to++ = *from++;
    case 4:        *to++ = *from++;
    case 3:        *to++ = *from++;
    case 2:        *to++ = *from++;
    case 1:        *to++ = *from++;
           } while (--n > 0);
    }