C Идиомы и мало известных [закрытых] фактов

7
задан Community 23 May 2017 в 11:48
поделиться

3 ответа

Оператор "стрелка" для обратного отсчёта от n-1 до 0:

for ( int i = n; i --> 0; ) ...

Это не очень распространённое явление, но интересная иллюстрация, что в некотором роде части цикла для инициализируют/тестируют/обновляют части петли условно. Это обычный паттерн, но в него можно поместить любые произвольные выражения.

Это также хорошее напоминание о том, как работает лексический анализ.

12
ответ дан 6 December 2019 в 07:50
поделиться

Так как кто-то все равно об этом скажет, это могу быть я: Устройство Даффа .

Это хорошая иллюстрация того, как работают лейблы на C, и понимание этого дало мне "ага опыт" в первый раз. Это его оригинальный код:

send(to, from, count)
register short *to, *from;
register count;
{
    register n=(count+7)/8;
    switch(count%8){
    case 0: do{ *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);
    }
}

Сегодня нельзя использовать регистр и избегать определений функций в старом стиле.

.
6
ответ дан 6 December 2019 в 07:50
поделиться

Оператор запятая, хотя и прекрасно документированный (K&R и т.д.), присутствует в довольно большом количестве алгоритмического кода и часто является сюрпризом для многих программистов, которые с ним раньше не сталкивались. Часто его используют для упрощения некоторых циклических конструкций:

#define kITERATIONS_MAX 10
int i=0,j=0,array[kITERATIONS_MAX],outArray[kITERATIONS_MAX],temp=0;

for (i=0,j=kITERATIONS_MAX-1; i < kITERATIONS_MAX; i++,j--)
{
temp = array[i]*array[j];
outArray[i]=temp;
}

В приведенном коде элементы массива 0 на 9 будут умножаться на 9 на 0, избегая при этом вложенных циклов.

При использовании оператора-запятой вычисляются как первое, так и второе выражения. Результат первого выражения игнорируется, а результат второго возвращается.

5
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: