![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
привет всем,
сегодня увидел такой код
ни разу не задумовался о запятых, и решил что этот код неверен, я ошибся. Теперь внимание вопрос, нафига это сделано? и второй вопрос зачем тогда нужны ; , если почти все заменяют запятые в том числе и тело цикла? |
|||
|
||||
Peter |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: -1 Всего: 1 |
С этим вопросом - к разработчикам стандарта Си++.
Точка с запятой указывает конец оператора. А запятые объединяют выражения в один оператор. Того же самого эффекта можно было бы достичь, если написать
-------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Запятые нужны в си, в первую очередь для форов (ну, не то, чтоб нужны - но удобно). В С++ - это, во-первых, наследие. Но кроме того есть перегрузка операторов, потому находятся и другие применения. Например, boost::asign.
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Запятые также иногда удобны в условиях конструкций if и while.
|
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
А ещё запятые можно перегружать
![]() --------------------
|
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: нет Всего: 3 |
Специально для этого их и придумали ![]() -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
можно пример, когда они удобны? ато я так сразу представить не могу |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
да вроде-бы можно перегружать, но только для своих классов...
|
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
перегружать можно, но поведение его будет очень сильно отличаться. Реализовать его семантику при перегрузке невозможно, поэтому результат этого перегруженного оператора будет очень удивительным для пользователя класса. Вы ведь не будете перегружать "+" так чтобы он в итоге реализовывал "-"... Добавлено через 9 минут и 15 секунд вот подобный случай обсуждался |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Fazil6, семантику менять - это нормально. Иногда Пример я уже привёл (boost::assign).
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
JackYF, конечно спорно
ради одной строчки так (имхо) загрязнять читаемость наверное, к этом нужно привыкнуть.......... |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
и в чем проблема? приведи пример, что по-твоему невозможно сделать -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
d06osipov |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Во-первых, я что-то не слышал про стандартную семантику && и ||. А во-вторых, при перегрузке копирующего конструктора и оператора = тоже меняется семантика. Это значит, их не рекомендуется перегружать? |
|||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
не совсем понимаю вопроса. В свою очередь встречный вопрос: как обеспечить чтобы левый операнд вычислялся всегда первым, а правый вторым?
ну и чем ты гордишься? Почитай топик по ссылке - там четко видно к чему приводит перегрузка ||
в четырнадцатых слабо себе представляю перегрузку копирующего конструктора, с изменяющейся семантикой... Понимаешь, старик, можно прегрузить к примеру operator-, изменив его семантику так, чтобы он делал умножение (согласись, это оригинально, ведь именно для этого перегрузку придумали). После этого в лучшем случае ты будешь проклят своими колегами, а может и покалечат (оторвут руки) |
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Интересная дискуссия. Много нового узнал... Но правда, не вижу надобности перегружать "operator ,". Это сообщение отредактировал(а) andrew_121 - 9.6.2008, 22:45 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
andrew_121, действительно, надобности это делать почти никогда нет. Но, иногда встречаются случаи, когда сделав это мы получим что-то, например, удобочитаемость кода. Пример, что лучше выглядит, это:
|
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
bsa: Да, беспорно, красивей, удобней, понятней! Респект!
Слышал про Boost, но некогда не юзал, поделитесь ссылками на оного. И на доки, и на форум об оном тожА. Плиз. Это сообщение отредактировал(а) andrew_121 - 9.6.2008, 21:38 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
http://www.google.com/search?q=boost Добавлено через 2 минуты и 6 секунд
Вся хитрость операторов && и || в том, что они не вычисляют второй свой аргумент, если уже по первому известен результат. |
||||
|
|||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
почитайте про точки следования
undefined behavior не страшен только тем, кто "намертво" прикреплен к одной версии определенного компилятора. В противном случае, может оказаться, что программа работает не так, как надо. Только потому, что кто-то ради "удобочитаемости"(и то - спорно) вместо пяти точек следования(к примеру; т.е. 5 строк с ";" в конце) сделал одну(после выражения перед первой запятой в строке). |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
skyboy: То же вариант.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
d06osipov |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
А что, есть смысл перегружать что-либо без изменения семантики? Перегрузка && и ||, как и перегрузка любых других операторов, приводит к изменению их семантики (вполне возможно, предыдущая семантика --- ошибка компиляци). Есть одна стандартная версия &&, || и т. п. для параметров (bool,bool) которую можно применять к указателям используя конвертацию указателей к bool. Что же может испортить перегрузка этих операторов для объектов и ссылок на объекты? Даже для указателей, мне кажется, гораздо опаснее использовать неявную конвертацию к bool, чем перегружать для них оператор && (тем более, что для (bool,bool) его нельзя перегрузить). |
|||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
конечно. Именно так и нужно перегружать. Что по твоему семантика? Семантика оператора - это его смысл. Смысл оператора "+" в сложении. Вот и перегружать его надо так, чтобы он по смыслу делал сложение. Где тут изменение семантики?
это поведение не ошибка, а соответствие стандарту. |
||||
|
|||||
d06osipov |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Я имел ввиду вот что:
В этом случае --- семантика оператора a1||a2 --- ошибка компиляции. Мы с вами по разному понимаем слово семантика. Я вкладываю в него не смысл, а то, что конкретно делает данная сущность (строгое определение во всех деталях), иными словами --- описание изменения состояния машины после выполнение данной сущности. А смысл я называю спецификацией (пример: +. Спецификация: сложить два числа. Семантика: записывает в стек сумму двух чисел без побочных эффектов). В этом случае, перегружать, не меняя семантики --- значит, писать тавтологичный код. |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
Не понимаю. В чем тогда по-твоему изменение семантики при перегрузке "+" для каких-нибудь объектов учитывая, что спецификация не изменилась(сложить два объекта)? |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
значит для тебя перегрузка оператора не должна менять его спецификацию а для оператора "," это не возможно |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
как это будет работать? т.е сначала выполняется std::getline(std::cin, s), потом !std::cin.eof(), а что проверяется в while? возвращаемое значение std::getline(std::cin, s)? |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
В большинстве случаев это верно. Но иногда удобна перегрузка без следования этим правилам. boost::asign, boost::lambda, boost::optiona, etc. - в качестве примеров. |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Это дискуссия, безконечна...
Спорить не буду, за - то же. Как не крути, но в перегрузке "oprator ," больше негатива, чем позитива. Так же, перегрузка "||" и "&&" вносит больше подозрений, непонятки, в код ее использующий. Зачем забивать себе голову еще и тем что, нужно помнить что эти операторы перегружены, когда и так у программера в голове, полно всякой полезной, и безполезной информации. Ведь проще написать пару лишних строк, чем забивать себе голову...(имхо) -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
оператор "запятая" возвращает значение последнего аргумента ![]() |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
неперегруженый, а перегруженый, может вернуть что угодно ![]() |
|||
|
||||
d06osipov |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Согласен. Но в большинстве случаев, программист знает, на что он идёт. И, скажем, если вы разрабатываете библиотеку, перегрузка оператора "," может испортить программу при подключении только в том случае, если: 1. Этот оператор объявлен все namespace, или используется using namespace (в противном случае, при уже существующей встроенной реализации "," будет выбираться пользовательская только в том случае, когда один из операндов имеет тип, находящийся в этом namespace, что не навредит. См. разрешение имён) 2. Этот оператор объявлен для типов, существующих вне библиотеки, например: template<class T,class S> T& operator , (const T&,const S&); //так делать не надо В Boost этот оператор применяется при левом аргументе имеющем совершенно скрытый тип, о котором пользователь даже не знает. Следовательно, этот оператор не может помешать правильной работе программы. Оператор "," полезно использовать вместо эллипса! Но надо быть осторожнsм, чтобы компилятор не воспринял , за знак отделения аргументов функции:
Т. о. Перегружать оператор , следует только в том случае, когда тип одного из операндов --- класс, к которому больше никак обращаться не следует. |
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Нет, как раз в данном случае сработает вызов функции с двумя параметрами. Поэтому использование запятой как подмены функции с произвольным количеством параметров - не лучшее решение
![]() |
|||
|
||||
d06osipov |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Запятая при вызове функции это не переопределение, а синтаксическая конструкция. На тех компиляторах, на которых я пробовал, это воспринималось как разделение аргументов. Не знаю, оговорено ли это явно в Стандарте, или нет, но в любом случае, лучше при использовании запятых заключить аргумент в скобки (как в примере). Это сообщение отредактировал(а) d06osipov - 10.6.2008, 16:53 |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
ммм, всем спасибо за ответы. Спор помоему пошел ни о чем.
Подведу итог: использование запятой ухудшает читабельность кода, но в некоторых случаех запятая удобна(перегруженная) как в случае с boost. Всем спасибо за ответы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |