КИТА unofficial
Апрель 20, 2024, 08:39:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Малоизвестные особенности С/С++  (Прочитано 64127 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« : Март 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 Offline

Пол: Мужской
Награды:
I место в фотоконкурсе \
Сообщений: 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 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
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #4 : Март 15, 2007, 06:58:43 »

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

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline 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 Offline

Пол: Мужской
Сообщений: 2399



« Ответ #6 : Март 18, 2007, 10:47:13 »

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



Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили.

Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит..

Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
Неудачник
Первак
*

Карма: +1/-0
Offline 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 Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #8 : Июнь 12, 2007, 02:07:32 »

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

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

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

int x;

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

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

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

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #9 : Декабрь 21, 2007, 05:44:41 »

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

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #10 : Декабрь 21, 2007, 06:17:52 »

tos, а при чем тут особенности языка? Это задача-"баян" - поменять местами значения двух целочисленных переменных без использования третьей.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #11 : Декабрь 21, 2007, 06:23:44 »

ну трюк то прикольный.
такое мало кто знает поэтому пусть почитают про такие фичи.полезно ведь.
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #12 : Декабрь 21, 2007, 06:25:04 »

tos

НО это не фича С++ как такового.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #13 : Декабрь 21, 2007, 06:28:42 »

а указатели на функцию есть и в ТРУПО ЛАСКАЛЕ!!!
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #14 : Декабрь 21, 2007, 06:30:00 »

кто-то позиционировал указатели на функцию как фичу, впервые появившуюся и имеющую место быть только в С++?
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #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 Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #16 : Декабрь 21, 2007, 06:32:47 »

Кстати можно написать довольно много решений этой задачи меняя только используемые операции (важно что бы операции были обратны друг-другу) к примеру +/-. Когда мне впервые эту задачку задали я придумал вообще вариант использующий умножение и деление, но я размышлял с точки зрения математики без привязки к конкретному языку Улыбка.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline 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;
}

Результат:
Код:
1264
0
0
Записан
Романыч
Я Романов!
Завкаф
****

Карма: +34/-2
Offline Offline

Пол: Мужской
Награды:
1 место в фотоконкурсе \
Сообщений: 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
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #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, Максимальное значение данного типа

Код:
unsigned max = ~0;
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Storm
Верховный
Администратор
Аспирант
*****

Карма: +29/-0
Offline Offline

Пол: Мужской
Сообщений: 484



« Ответ #20 : Июль 14, 2008, 10:53:03 »

проверишь на 64 битной платформе - получишь 8 вместо 4 (на настоящей 64 бита типа UltraSparc). С преобразовал символ в число и в программме обработал целую переменную базового типа int. С++ обрабатывал как char - это скорее можно отнести к особенностям компиляторов, хотя стандарты на язык порыть не помешает, если это важно Улыбка
Записан

Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн)
----------------------------------------------------
"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

Проходит ирландец мимо паба....
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #21 : Июль 14, 2008, 12:13:39 »

по моему дело не в самой платформе а в разрядности компилятора, не так ли?
например в VS есть компилятор x86-64
Записан
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #22 : Июль 14, 2008, 12:22:03 »

Storm, ну дык это и требовалось. Не особенности компилятора, а особенности самого языка получается. Т.е. для С++ мы получим 1, а для С не 1 Улыбка
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #23 : Июль 14, 2008, 04:45:28 »

Смотрим на отличия языков ISO C и C++, описанные в самом Стандарте С++:
Цитировать
Change: Type of character literal is changed from int to char
Rationale: This is needed for improved overloaded function argument type matching. For example:
int function( int i );
int function( char c );
function( ’x’ );
It is preferable that this call match the second version of function rather than the first.
Effect on original feature: Change to semantics of well-defined feature. ISO C programs which depend on
sizeof(’x’) == sizeof(int)
will not work the same as C++ programs.
Difficulty of converting: Simple.
How widely used: Programs which depend upon sizeof(’x’) are probably rare.
Про оператор sizeof:
Цитировать
The sizeof operator yields the number of bytes in the object representation of its operand.
...
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.
Стандарт С++ обязывает рассматривать символьный литерал как объект типа char, размер которого вне зависимости от реализации обязан быть равен одному.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #24 : Июль 29, 2012, 02:20:41 »

1. многие знакомы с тернарным оператором

x = (y < 0) ? 10 : 20;

но далеко не всем известно, что тернарный оператор может быть lvalue, т.е. находится слева от оператора присваивания:

(a == 0 ? a : b) = 1;

Что является сокращением для следующего кода:

if (a == 0)
    a = 1;
else
    b = 1;

2. в инициализационной части цикла for могут быть объявлены не только переменные но и классы, объекты, структуры, функции и т.д. Например

for(struct { int a; float b; } loop = { 1, 2 }; ...; ...) {
    ...
}
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Страниц: 1 2 [Все]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.094 секунд. Запросов: 37.