Малоизвестные особенности С/С++

(1/5) > >>

LazarusLong:
Предлагаю писать сюда сабж.

1. Запись блока операторов в одну строку через запятую:
Оказывается запись:
{
 a=3;
 b=4;
 c=1;
}
Равносильна записи:
a=3, b=4, c=1;
При этом вся строка считается одним операторным блоком.

2. Можно еще и так:
float a = (flag?sin:cos)(x);
В данном случае результатом выполнения (flag?sin:cos) будет по видимому адрес вызваемой функции, которой передатся параметр (х).

3. Меняем индекс и массив местами
Имеем:
int a[10], i;

Обращения a[ i ] и i[a] - эквивалентны. Ведь на самом деле - a[ i ]==*(a+i)==*(i+a)==i[a]. От перемены мест слагаемых сумма не изменяется!

grimgav:
Цитата: LazarusLong от Март 15, 2007, 04:46:52

2. Можно еще и так:
float a = (flag?sin:cos)(x);
В данном случае результатом выполнения (flag?sin:cos) будет по видимому адрес вызваемой функции, которой передатся параметр (х).

3. Меняем индекс и массив местами
Имеем:
int a[10], i;

Обращения a[ i ] и i[a] - эквивалентны. Ведь на самом деле - a[ i ]==*(a+i)==*(i+a)==i[a]. От перемены мест слагаемых сумма не изменяется!


Как по мне, совершенно бесполезно, только лишний раз запутает того, кто будет читать исходники.

Storm:
за третий фокус надо по пятой точке бейсбольной битой давать, потому что этот фортиль скорее всего не переносимый. (как минимум может доставить головную боль, особенно при сложных моделях памяти)

первый еще более-менее полезно (условно)

второе конечно интересно, но с ифом проще и понятнее, а по коду не намного больше

Alder:
Цитата: LazarusLong от Март 15, 2007, 04:46:52

3. Меняем индекс и массив местами
Имеем:
int a[10], i;

Обращения a[ i ] и i[a] - эквивалентны. Ведь на самом деле - a[ i ]==*(a+i)==*(i+a)==i[a]. От перемены мест слагаемых сумма не изменяется!

А какой практический смысл этого?

vimmax:
Alder - я думаю практического смысла никакого, только теоретически показать возможность использования адресной арифметики в С, типа
a[ i ] равонсильно *(a+i)

Навигация

[0] Главная страница сообщений

[#] Следующая страница