LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« : Март 15, 2007, 04:46:52 » |
|
Предлагаю писать сюда сабж.
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
↑ так меня зовут, а это я говорю →
Просто гламурный
Проректор
Карма: +161/-17
Offline
Пол: Награды:
Сообщений: 4636
не ^i^
|
|
« Ответ #1 : Март 15, 2007, 04:51:27 » |
|
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
Верховный
Администратор
Аспирант
Карма: +29/-0
Offline
Пол:
Сообщений: 484
|
|
« Ответ #2 : Март 15, 2007, 06:34:36 » |
|
за третий фокус надо по пятой точке бейсбольной битой давать, потому что этот фортиль скорее всего не переносимый. (как минимум может доставить головную боль, особенно при сложных моделях памяти)
первый еще более-менее полезно (условно)
второе конечно интересно, но с ифом проще и понятнее, а по коду не намного больше
|
|
|
Записан
|
Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн) ---------------------------------------------------- "There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson
Проходит ирландец мимо паба....
|
|
|
Alder
|
|
« Ответ #3 : Март 15, 2007, 06:49:16 » |
|
3. Меняем индекс и массив местами Имеем: int a[10], i;
Обращения a[ i ] и i[a] - эквивалентны. Ведь на самом деле - a[ i ]==*(a+i)==*(i+a)==i[a]. От перемены мест слагаемых сумма не изменяется!
А какой практический смысл этого?
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
vimmax
Mодератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #4 : Март 15, 2007, 06:58:43 » |
|
Alder - я думаю практического смысла никакого, только теоретически показать возможность использования адресной арифметики в С, типа a[ i ] равонсильно *(a+i)
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #5 : Март 15, 2007, 07:25:03 » |
|
Предлагаю писать сюда сабж.
1. Запись блока операторов в одну строку через запятую: Оказывается запись: { a=3; b=4; c=1; } Равносильна записи: a=3, b=4, c=1; При этом вся строка считается одним операторным блоком.
Да и более того, запятая это вообще отдельный оператор. Оператор «запятая» вычисляет все операнды, после этого отбрасывает результаты всех левых операндов. Результатом оператора «запятая» становится результат самого правого операнда, а типом - его тип. Как и могие другие операторы оператор «запятая» можно перегрузить ))) за третий фокус надо по пятой точке бейсбольной битой давать, потому что этот фортиль скорее всего не переносимый. (как минимум может доставить головную боль, особенно при сложных моделях памяти)
Ну насколько я понимаю, третий фокус ничего в себе противозаконного не содержит. Альтернативная запись, которая по идее должна работать везде, где работает адресная арифметика с указателями на элементы массива.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
zer_owlet
Необычные пользователи
Проректор
Карма: +103/-16
Offline
Пол:
Сообщений: 2399
|
|
« Ответ #6 : Март 18, 2007, 10:47:13 » |
|
гы )) когда Сная рассказал про третий фокус, я его пересказал у себя в офисе руководителю десктопного направления (у человека даже на знаю сколько лет опыта). он долго не верил. когда проверил - обзванивал своих знакомых, расказывал.... все были в шоке.
|
|
|
Записан
|
Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили. Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит.. Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
|
|
|
Неудачник
Первак
Карма: +1/-0
Offline
Сообщений: 17
|
|
« Ответ #7 : Июнь 12, 2007, 01:55:13 » |
|
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. Спасибо за интересную тему! Выиграл много пива!!!
|
|
|
Записан
|
Will code cpp for food
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #8 : Июнь 12, 2007, 02:07:32 » |
|
Вот еще подобный трюк. Может ли функция находится слева от оператора присваивания?
К примеру? f() = 5;
Да запросто. Нужно только, что бы функция возвращала ссылку на переменную соответствующего типа.
int x;
int &f() { return x;//Возврат ссылки на х. }
main() { f() = 5; cout << x; return 0; }
Как несложно догадаться на экран выведется 5.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
tos
|
|
« Ответ #9 : Декабрь 21, 2007, 05:44:41 » |
|
обмен значений двух переменных x ^= y ^= x ^=y по скорости и объему машинного кода сильно проигрывает стандартному "tmp = x; x = y; y = tmp;", поэтому пользоваться не рекомендуется.
|
|
|
Записан
|
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #10 : Декабрь 21, 2007, 06:17:52 » |
|
tos, а при чем тут особенности языка? Это задача-"баян" - поменять местами значения двух целочисленных переменных без использования третьей.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
tos
|
|
« Ответ #11 : Декабрь 21, 2007, 06:23:44 » |
|
ну трюк то прикольный. такое мало кто знает поэтому пусть почитают про такие фичи.полезно ведь.
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #12 : Декабрь 21, 2007, 06:25:04 » |
|
tos
НО это не фича С++ как такового.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
tos
|
|
« Ответ #13 : Декабрь 21, 2007, 06:28:42 » |
|
а указатели на функцию есть и в ТРУПО ЛАСКАЛЕ!!!
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #14 : Декабрь 21, 2007, 06:30:00 » |
|
кто-то позиционировал указатели на функцию как фичу, впервые появившуюся и имеющую место быть только в С++?
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
tos
|
|
« Ответ #15 : Декабрь 21, 2007, 06:31:33 » |
|
кто-то позиционировал указатели на функцию как фичу С++? 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
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #16 : Декабрь 21, 2007, 06:32:47 » |
|
Кстати можно написать довольно много решений этой задачи меняя только используемые операции (важно что бы операции были обратны друг-другу) к примеру +/-. Когда мне впервые эту задачку задали я придумал вообще вариант использующий умножение и деление, но я размышлял с точки зрения математики без привязки к конкретному языку .
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #17 : Июль 11, 2008, 05:32:39 » |
|
Увидил в примере из книги Павловской, жутко удивился, попробовал, работает #include <iostream.h>
void main() { int a; cout<<a<<endl;
a=int(); cout<<a<<endl;
a=float(); cout<<a<<endl; } Результат:
|
|
|
Записан
|
|
|
|
Романыч
Я Романов!
Завкаф
Карма: +34/-2
Offline
Пол: Награды:
Сообщений: 1068
Я Русский!
|
|
« Ответ #18 : Июль 11, 2008, 05:58:14 » |
|
Флуд почистил. Спор и все такое решаем через личку! Романыч
|
|
« Последнее редактирование: Июль 12, 2008, 11:39:11 от Романыч »
|
Записан
|
Freelance, web designer, front-end & back-end developer, java developer, php developer. A person who enjoys designing software and building programs.
|
|
|
Alder
|
|
« Ответ #19 : Июль 12, 2008, 11:43:39 » |
|
Как программно определить, какой язык используется - С или С++?#include <stdio.h>
int main () { printf ("%d\n", sizeof ('a')); return 0; } Для С результат будет равен 4, а для С++ 1. Проверялось на gcc/c++. ( Отправлено в: 12 Июля 2008, 11:42:06) C, Максимальное значение данного типа
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
|