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

<< < (2/5) > >>

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

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

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


Да и более того, запятая это вообще отдельный оператор. Оператор «запятая» вычисляет все операнды, после этого отбрасывает результаты всех левых операндов. Результатом оператора «запятая» становится результат самого правого операнда, а типом - его тип.
Как и могие другие операторы оператор «запятая» можно перегрузить )))

Цитата: Storm от Март 15, 2007, 06:34:36

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


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

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

Неудачник:
int f1(int p1, int p2){};
int f2(int p1, int p2){};
int (f*)(int,int); // указатель на ф-цию
f=f1;
int r1=f(1,2); // вызываем f1
f=f2;
int r2=f(1,2); // вызываем f2
P.S. Спасибо за интересную тему! Выиграл много пива!!!

LazarusLong:
Вот еще подобный трюк. Может ли функция находится слева от оператора присваивания?

К примеру?
f() = 5;

Да запросто. Нужно только, что бы функция возвращала ссылку на переменную соответствующего типа.

int x;

int &f()
{
   return x;//Возврат ссылки на х.
}

main()
{
 f() = 5;
 cout << x;
 return 0;
}

Как несложно догадаться на экран выведется 5.

tos:
обмен значений двух переменных
x ^= y ^= x ^=y
по скорости и объему машинного кода сильно проигрывает стандартному "tmp = x; x = y; y = tmp;", поэтому пользоваться не рекомендуется.

Навигация

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

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

[*] Предыдущая страница