Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Тонкости языка C++   Найти похожие ветки 

 
Cyrax ©   (2006-09-11 19:46) [0]

Уважаемые господа-программисты. Разрешите предложить вам тему для обсуждения некоторых тонкостей языка программирования C++. До меня дошли сведения о присутствии на данном форуме компетентных программистов, неплохо знающих семейство языков C. Ввиду этого обстоятельства считаю непредосудительным осмелиться предложить вам эту тему для обсуждения. Искренне надеюсь, что такое решение не будет воспринято вами как необдуманный и опрометчивый поступок.

С уважением, Cyrax


 
PSPF2003 ©   (2006-09-11 19:50) [1]

WOW


 
Gero ©   (2006-09-11 19:53) [2]

Если вместо { и } использовать begin и end, то программа не скомпилируется.


 
Ega23 ©   (2006-09-11 19:55) [3]

a=b это а:=b, а а==b это a=b  :о)


 
Cyrax ©   (2006-09-11 19:58) [4]

Уважаемые Gero и Ega32.
Не сочтите за грубость и разрешите поинтересоваться, что вы имеете ввиду в предыдущих сообщениях.

С уважением, Cyrax


 
PSPF2003 ©   (2006-09-11 20:00) [5]

if (а == б) {

{


 
PSPF2003 ©   (2006-09-11 20:02) [6]


> Cyrax ©

Обсуждали тонкости языка


 
Cyrax ©   (2006-09-11 20:22) [7]

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

bool f = true;
double x = (f ? sin:cos)(1.299);

Guav, напиши ещё раз, чтобы восстановить тему... (кстати, ты придумал что-нибудь ?)
Потом пойдём дальше.


 
Nic ©   (2006-09-11 21:22) [8]

Вот есть немалый опыт работы в Delphi и очень поверхностное представление о C++. Насколько быстро можно перестроиться на новый ЯП и начать писать проекты не задумываясь о конструкциях языка, т.е. без всяких справочяников помнить

{} = begin end;
== = =
=  = :=
void ... = procedure...
и т.д.


 
Аноним2000   (2006-09-11 21:39) [9]


> Ega23 ©   (11.09.06 19:55) [3]
>
> a=b это а:=b, а а==b это a=b  :о)

не факт :)
выражения a=b или а==b могут трактоваться как угодно)


> bool f = true;
> double x = (f ? sin:cos)(1.299);

дело в том, что в в отличие от С в С++ в <math.h> определено целое семейство sin и cos
типа
float sin(float)
double sin(double)
long double sin(long double)

когда ты пишешь, скажем, "sin(3.14)", компилятор рюхает, что выражение "3.14" имеет тип double вызывает вторую версию функции. Это явление называется перегрузкой функций. В этом нет ничего особенного, в Делфи такое тоже есть.
когда ты пишешь "(f ? sin:cos)" компилятор не знает какую функцию sin ты имеешь ввиду. Поэтому и ругается.

Решить эту проблему можно след образом:

typedef double (*F)(double);
double x = (f ? (F)sin : (F)cos)(1.299);

здесь мы явно указываем с какой версией имеем дело.

Кстати "sin(2)" тоже не может разрешиться. Ведь int может с одинаковым успехом преобразован и к float, и к double, и к long double.


double x = sin (double(2)); //явно указываем тип
//или, по извращенски
typedef double (*F)(double);
F f = sin;
double x = f(2);


 
DiamondShark ©   (2006-09-11 21:46) [10]

RTFS

функции sin и cos перегружены:
float sin(float)
double sin(double)
long double sin(long double)

аналогично для косинуса.

разумеется, компилятор не имеет ни малейшего представления о том, какую версию функции подставлять.

для неперегруженных функций все работает:

float x = (f ? sinf : cosf)(1.23);


> Задача заключается в том, чтобы доказательно обосновать
> тот факт, что в C этот фрагмент скомпилится без проблем,
>  а в C++ возникнут ошибки.

В пень.
Для этого надо разребать макароны условной компиляции в .h файлах, в зависимости от настроек компилера, разыскивая, почему в одном случае у функций три перегрузки, а в другом только одна.
Мазохистив нэма.


 
Cyrax ©   (2006-09-11 23:37) [11]

DiamondShark ©   (11.09.06 21:46) [10]
В пень.
Для этого надо разребать макароны условной компиляции в .h файлах, в зависимости от настроек компилера, разыскивая, почему в одном случае у функций три перегрузки, а в другом только одна.
Мазохистив нэма.

А бофа и не нада...

_______________
С этим всё ясно.
Если никто больше ничего не хочет сказать, пойдём дальше.

Неплохо было бы придумать фрагмент кода, отражающий тонкую особенность языка C++. Этот фрагмент не должен быть большим (по крайней мере, желательно). Должен быть поставлен вопрос типа "как поведёт себя компилятор" или "чаво получим" и т.п. По сложности не должен быть проще приведённого мной. Желательно сложнее. ГОРАЗДО СЛОЖНЕЕ.
Можно использовать итераторы, парсеры, распределители и т.д.
В каком направлении мозговать, думаю понятно...

Кстати, можно и на различия C и C++, и на тонкости C++.


 
DrPass ©   (2006-09-11 23:58) [12]


> Gero ©   (11.09.06 19:53) [2]
> Если вместо { и } использовать begin и end, то программа
> не скомпилируется.

Легко :) Сишный препроцессор и большее извращение вытерпит...


 
Cyrax ©   (2006-09-12 00:01) [13]

А ето шо такое ?


 
DrPass ©   (2006-09-12 00:06) [14]

Энто такая хитрая штучка, которая проходит по исходнику перед компилятором и выполняет его преобразование в зависимости от условных директив.


 
Cyrax ©   (2006-09-12 00:09) [15]

Это процессоптер, шо ли ?


 
Аноним2000   (2006-09-12 00:10) [16]


> > Задача заключается в том, чтобы доказательно обосновать
> > тот факт, что в C этот фрагмент скомпилится без проблем,
>
> >  а в C++ возникнут ошибки.
>
> В пень.
> Для этого надо разребать макароны условной компиляции в
> .h файлах, в зависимости от настроек компилера, разыскивая,
>  почему в одном случае у функций три перегрузки, а в другом
> только одна.
> Мазохистив нэма.
>

в .h файлы-то зачем лезть? никаких там доказательств нет. там т.н. особенности реализации )


 
default ©   (2006-09-12 00:13) [17]

Cyrax ©   (12.09.06 00:09) [15]

> Это процессоптер, шо ли ?

откуда ты такое дикое слово взял?
я думал ты прикалываешься, а похоже нет:)
для тебя существует процессоптер, а препроцессор нет!


 
Cyrax ©   (2006-09-12 00:15) [18]

Я тему разрулить хочу - а вы её хламите...


 
Cyrax ©   (2006-09-12 00:23) [19]

Guav, ты где ?
Что-нибудь придумал ?


 
Cyrax ©   (2006-09-12 00:57) [20]

В общем, текущая тема указана в 11-м посте...


 
07BB   (2006-09-12 07:22) [21]

#ifndef _PASCAL_H
#define _PASCAL_H
#define begin {
#edfine end }
#endif //_PASCAL_H

и будет вам вообще всегда все три УУУРРРААА

зы
В свое время слышал про библиотеку которая из С Паскаль делала, только зачем?


 
guav ©   (2006-09-12 16:13) [22]

> Guav, напиши ещё раз, чтобы восстановить тему...

В прошлой ветке я указал такой вариант:
(в нём sin и cos локальные переменные, указзывающие на конкретные функции)
int main()
{
double (*sin)(double x) = ::sin;
double (*cos)(double x) = ::cos;
bool f = true;
double x = (f ? sin:cos)(1.299);
return 0;
}


Программирующие на С/С++ больше посещают на форумы по С/С++, чем по Delphi, поэтому обращатся стоит на те форумы. Например, тут обсуждают тонкости С++ :
http://rsdn.ru/Forum/Message.aspx?mid=1520800&only=1
http://rsdn.ru/Forum/Message.aspx?mid=2103198&only=1
http://rsdn.ru/Forum/Message.aspx?mid=116044&only=1


 
Cyrax ©   (2006-09-12 19:43) [23]

guav ©   (12.09.06 16:13) [22]
Программирующие на С/С++ больше посещают на форумы по С/С++, чем по Delphi

Я сейчас и на Delphi, и на C++, и на C# одновременно сижу. Попутно изучаю Java, Qt, NCReport и MySQL.

А на C"ных форумах я тоже сижу.

поэтому обращатся стоит на те форумы. Например, тут обсуждают тонкости С++ :

А нужно ещё сложнее. ГОРАЗДО СЛОЖНЕЕ.


 
Zz_   (2006-09-12 19:49) [24]

Тебе сюда ...

http://gzip.rsdn.ru/Forum/Message.aspx?mid=676170


 
Cyrax ©   (2006-09-12 23:32) [25]

Уууу, какую тексту откопал...
Как будто по голове настучали...

Вообще-то до качественной кодогенерации ещё очень далеко...
А вот про "математически нестройные системы" я чего-то не совсем понял. Да ещё и про Linux на микроядре... По моему, это Windows не совсем стройная...
А прочитать 20 книг про C++ - это что-то особенное...

Нельзя научить писать программы на C++

В том-то и дело, что многие хотят, чтобы их НАУЧИЛИ... Меня, например, никто не учил. Я сам освоился...

На этом языке можно сказать двусмысленность – и не получить линейкой по рукам от компилятора(сноска: …а трое суток искать, почему программа вылетает, когда i=17.). Здесь есть место творчеству – здесь есть место спорам – здесь есть место 48-часовым марафонам по отладке программ. Есть тонкости, доступные только снобам. Здесь нет только одного – места, где можно было бы остановиться и сказать: все, ничего нового для меня в этом мире не осталось.

Осталось только пристрелиться...
В общем хотят заключить тебя в какие-то рамки, инаыми словами - в тиски зажать... чтоб не дрыгался...


 
default ©   (2006-09-12 23:43) [26]

Cyrax ©   (12.09.06 23:32) [25]
ты с C# и с asm знаком? хошь загадку загадаю?


 
Cyrax ©   (2006-09-12 23:48) [27]

Шо, опять ?
Я ещё первую разгадываю...


 
default ©   (2006-09-12 23:52) [28]

Cyrax ©   (12.09.06 23:48) [27]
всё не теряешь надежду сделать невозможное?
ты там только свою классовую самодокументируемую иерархию не пиши:)
ибо это не удовлятворяет условию - произвольный тип объекта:)
а лучше покайся и скажи - был не прав так и так...:)


 
Cyrax ©   (2006-09-13 00:04) [29]

Тихо ты. Народ распугаешь...

всё не теряешь надежду сделать невозможное?

Разве ето сложно ?
Разработка трёхзвенной иерархической архитектуры процессоптера на базе цептографических дейтограммных нейро-пингвинов уже почти завершена...
Осталось зафигачить виртуальную матрицу самосинтезируемых криптонейронных процессов и - дело в шляпе...

а лучше покайся и скажи - был не прав так и так...:)

На шо ето ты намекаешь ?
Тема рульная - всё чих-пых. Запоров нет...


 
Alkid ©   (2006-09-13 10:53) [30]


> На этом языке можно сказать двусмысленность – и не получить
> линейкой по рукам от компилятора(сноска: …а трое суток искать,
>  почему программа вылетает, когда i=17.). Здесь есть место
> творчеству – здесь есть место спорам – здесь есть место
> 48-часовым марафонам по отладке программ. Есть тонкости,
>  доступные только снобам. Здесь нет только одного – места,
>  где можно было бы остановиться и сказать: все, ничего нового
> для меня в этом мире не осталось.

Да, С++ таков :-) За мощность языка надо платить.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.014 c
2-1158056617
dest81
2006-09-12 14:23
2006.10.01
*.odb


2-1157927362
XxXxXxxxxxxxxx
2006-09-11 02:29
2006.10.01
?


2-1157719138
Juri
2006-09-08 16:38
2006.10.01
проверка на существования записи в базе данных


9-1136053715
haZard0us
2005-12-31 21:28
2006.10.01
GLScene=ландшафт+тайлы


15-1157997353
Nic
2006-09-11 21:55
2006.10.01
Visual Studio





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский