Малоизвестные особенности С/С++
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;", поэтому пользоваться не рекомендуется.
Навигация