Оператор "стрелка" для обратного отсчёта от n-1
до 0
:
for ( int i = n; i --> 0; ) ...
Это не очень распространённое явление, но интересная иллюстрация, что в некотором роде части цикла для
инициализируют/тестируют/обновляют части петли условно. Это обычный паттерн, но в него можно поместить любые произвольные выражения.
Это также хорошее напоминание о том, как работает лексический анализ.
Так как кто-то все равно об этом скажет, это могу быть я: Устройство Даффа .
Это хорошая иллюстрация того, как работают лейблы на 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);
}
}
Сегодня нельзя использовать регистр
и избегать определений функций в старом стиле.
Оператор запятая, хотя и прекрасно документированный (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, избегая при этом вложенных циклов.
При использовании оператора-запятой вычисляются как первое, так и второе выражения. Результат первого выражения игнорируется, а результат второго возвращается.