Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор , 
V
    Опции темы
vinter
Дата 6.6.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



привет всем,
сегодня увидел такой код
Код

while(*src) *dest=*src, ++src, ++dest;

ни разу не задумовался о запятых, и решил что этот код неверен, я ошибся. Теперь внимание вопрос, нафига это сделано? и второй вопрос зачем тогда нужны ; , если почти все заменяют запятые в том числе и тело цикла?


--------------------
Мой блог
PM MAIL WWW   Вверх
Peter
Дата 6.6.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Цитата(vinter @  6.6.2008,  14:46 Найти цитируемый пост)
нафига это сделано?

С этим вопросом - к разработчикам стандарта Си++.

Цитата(vinter @  6.6.2008,  14:46 Найти цитируемый пост)
зачем тогда нужны ; , если почти все заменяют запятые в том числе и тело цикла?

Точка с запятой указывает конец оператора. А запятые объединяют выражения в один оператор. Того же самого эффекта можно было бы достичь, если написать
Код
while(*src) {*dest=*src; ++src; ++dest;}



--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Любитель
Дата 6.6.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Запятые нужны в си, в первую очередь для форов (ну, не то, чтоб нужны - но удобно). В С++ - это, во-первых, наследие. Но кроме того есть перегрузка операторов, потому находятся и другие применения. Например, boost::asign.


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 7.6.2008, 00:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Запятые также иногда удобны в условиях конструкций if и while.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
chipset
Дата 7.6.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



А ещё запятые можно перегружать  smile 


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
bronislav
Дата 8.6.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Цитата(chipset @  7.6.2008,  20:24 Найти цитируемый пост)
А ещё запятые можно перегружать 

Специально для этого их и придумали  smile 


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Alek86
Дата 9.6.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(JackYF @  7.6.2008,  00:33 Найти цитируемый пост)
Запятые также иногда удобны в условиях конструкций if и while.

можно пример, когда они удобны?
ато я так сразу представить не могу


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 9.6.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(bronislav @  8.6.2008,  21:30 Найти цитируемый пост)
Специально для этого их и придумали

совсем не для этого. Семантика оператора "," меняется при перегрузке и поэтому не рекомендуется его перегружать. Тудаже относится и перегрузка && и ||
PM MAIL   Вверх
Lazin
Дата 9.6.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



да вроде-бы можно перегружать, но только для своих классов...
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 9.6.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Lazin @  9.6.2008,  11:21 Найти цитируемый пост)
да вроде-бы можно перегружать, но только для своих классов... 

перегружать можно, но поведение его будет очень сильно отличаться. Реализовать его семантику при перегрузке невозможно, поэтому результат этого перегруженного оператора будет очень удивительным для пользователя класса. 
Вы ведь не будете перегружать "+" так чтобы он в итоге реализовывал "-"...

Добавлено через 9 минут и 15 секунд
вот подобный случай обсуждался

PM MAIL   Вверх
Любитель
Дата 9.6.2008, 12:42 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Fazil6, семантику менять - это нормально. Иногда Пример я уже привёл (boost::assign).


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 9.6.2008, 17:18 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Alek86 @  9.6.2008,  08:40 Найти цитируемый пост)
можно пример, когда они удобны?
ато я так сразу представить не могу

Код

std::vector<std::string> buffers;
std::string s;
while (std::getline(std::cin, s), !std::cin.eof())
{
  buffers.push_back(s);
}



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 9.6.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Fazil6 @  9.6.2008,  11:51 Найти цитируемый пост)
Реализовать его семантику при перегрузке невозможно

почему?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 9.6.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



JackYF, конечно спорно
ради одной строчки так (имхо) загрязнять читаемость
наверное, к этом нужно привыкнуть..........


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 9.6.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(MAKCim @  9.6.2008,  17:39 Найти цитируемый пост)
почему? 

потому, что нужно обеспечить порядок вычисления операндов
PM MAIL   Вверх
MAKCim
Дата 9.6.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Fazil6 @  9.6.2008,  18:01 Найти цитируемый пост)
потому, что нужно обеспечить порядок вычисления операндов 

и в чем проблема?
приведи пример, что по-твоему невозможно сделать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
d06osipov
Дата 9.6.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  9.6.2008,  10:57 Найти цитируемый пост)
Семантика оператора "," меняется при перегрузке и поэтому не рекомендуется его перегружать. Тудаже относится и перегрузка && и || 


Во-первых, я что-то не слышал про стандартную семантику && и ||. А во-вторых, при перегрузке копирующего конструктора и оператора = тоже меняется семантика. Это значит, их не рекомендуется перегружать?

PM MAIL   Вверх
Fazil6
Дата 9.6.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(MAKCim @  9.6.2008,  18:20 Найти цитируемый пост)
приведи пример, что по-твоему невозможно сделать

не совсем понимаю вопроса. В свою очередь встречный вопрос: как обеспечить чтобы левый операнд вычислялся всегда первым, а правый вторым?
Цитата(d06osipov @  9.6.2008,  19:09 Найти цитируемый пост)
Во-первых, я что-то не слышал про стандартную семантику && и ||.

ну и чем ты гордишься? Почитай топик по ссылке - там четко видно к чему приводит перегрузка ||
Цитата(d06osipov @  9.6.2008,  19:09 Найти цитируемый пост)
А во-вторых, при перегрузке копирующего конструктора и оператора = тоже меняется семантика. Это значит, их не рекомендуется перегружать?

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

PM MAIL   Вверх
andrew_121
Дата 9.6.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата

После этого в лучшем случае ты будешь проклят своими колегами, а может и покалечат (оторвут руки)

Интересная дискуссия. Много нового узнал...
Но правда, не вижу надобности перегружать "operator ,".

Это сообщение отредактировал(а) andrew_121 - 9.6.2008, 22:45


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.6.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



andrew_121, действительно, надобности это делать почти никогда нет. Но, иногда встречаются случаи, когда сделав это мы получим что-то, например, удобочитаемость кода. Пример, что лучше выглядит, это:
Код
std::vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);
array.push_back(6);
array.push_back(7);
или это
Код
std::vector<int> array;
using namespace boost::assign;
array += 1,2,3,4,5,6,7;

PM   Вверх
andrew_121
Дата 9.6.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



bsa: Да, беспорно, красивей, удобней, понятней! Респект!
Слышал про Boost, но некогда не юзал, поделитесь ссылками на оного. И на доки, и на форум об оном тожА. Плиз.

Это сообщение отредактировал(а) andrew_121 - 9.6.2008, 21:38


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.6.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(andrew_121 @ 9.6.2008,  21:20)
Слышал про Boost, но некогда не юзал, поделитесь ссылками на оного.

http://www.google.com/search?q=boost

Добавлено через 2 минуты и 6 секунд
Цитата(MAKCim @ 9.6.2008,  18:20)
Цитата(Fazil6 @  9.6.2008,  18:01 Найти цитируемый пост)
потому, что нужно обеспечить порядок вычисления операндов 

и в чем проблема?
приведи пример, что по-твоему невозможно сделать

Вся хитрость операторов && и || в том, что они не вычисляют второй свой аргумент, если уже по первому известен результат.
PM   Вверх
skyboy
Дата 9.6.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



почитайте про точки следования
undefined behavior не страшен только тем, кто "намертво" прикреплен к одной версии определенного компилятора. В противном случае, может оказаться, что программа работает не так, как надо. Только потому,  что кто-то ради "удобочитаемости"(и то - спорно) вместо пяти точек следования(к примеру; т.е. 5 строк с ";" в конце) сделал одну(после выражения перед первой запятой в строке). 
PM MAIL   Вверх
andrew_121
Дата 9.6.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



skyboy:  То же вариант.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
d06osipov
Дата 10.6.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  9.6.2008,  20:26 Найти цитируемый пост)
в четырнадцатых слабо себе представляю перегрузку копирующего конструктора, с изменяющейся семантикой

А что, есть смысл перегружать что-либо без изменения семантики? 


Цитата(Fazil6 @  9.6.2008,  20:26 Найти цитируемый пост)
Цитата(d06osipov @  9.6.2008,  19:09 Найти цитируемый пост)
Во-первых, я что-то не слышал про стандартную семантику && и ||.

ну и чем ты гордишься? Почитай топик по ссылке - там четко видно к чему приводит перегрузка ||

Перегрузка && и ||, как и перегрузка любых других операторов, приводит к изменению их семантики (вполне возможно, предыдущая семантика --- ошибка компиляци). Есть одна стандартная версия &&, || и т. п. для параметров (bool,bool) которую можно применять к указателям используя конвертацию указателей к bool. Что же может испортить перегрузка этих операторов для объектов и ссылок на объекты? Даже для указателей, мне кажется, гораздо опаснее использовать неявную конвертацию к bool, чем перегружать для них оператор && (тем более, что для (bool,bool) его нельзя перегрузить).
PM MAIL   Вверх
Fazil6
Дата 10.6.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(d06osipov @  10.6.2008,  09:03 Найти цитируемый пост)
А что, есть смысл перегружать что-либо без изменения семантики? 

конечно. Именно так  и нужно перегружать. Что по твоему семантика? Семантика оператора - это его смысл. Смысл оператора "+" в сложении. Вот и перегружать его надо так, чтобы он по смыслу делал сложение. Где тут изменение семантики?
Цитата(d06osipov @  10.6.2008,  09:03 Найти цитируемый пост)
Перегрузка && и ||, как и перегрузка любых других операторов, приводит к изменению их семантики
 правильная перегрузка не должна изменять семантику. Перегрузка стандартных "&&", "||" и "," всегда приводит к изменению семантики, ибо стандартная семантика этих операторов фиксирует порядок вычисления аргументов, и далеко не всегда эти операторы вычисляют оба аргумента, а перегрузка делает их совершенно обычными операторами. Такое поведение нестандартно для этих операторов. Ты в коде видишь a+b и совершенно справедливо ожидаешь от этого выражения сложения. Совершенно справедливо от выражения a||b ожидать того, что делает оператор || , а не обычная функция, аргументами, которой являются  a и b.

Цитата(d06osipov @  10.6.2008,  09:03 Найти цитируемый пост)
(вполне возможно, предыдущая семантика --- ошибка компиляци)

это поведение  не ошибка, а соответствие стандарту. 
PM MAIL   Вверх
d06osipov
Дата 10.6.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  10.6.2008,  09:58 Найти цитируемый пост)

это поведение  не ошибка, а соответствие стандарту.  


Я имел ввиду вот что:
Код

class A{};

int main()
{ A a1,a2;
  a1||a2;
  return 0;
}

В этом случае --- семантика оператора a1||a2 --- ошибка компиляции.

Цитата(Fazil6 @  10.6.2008,  09:58 Найти цитируемый пост)
Что по твоему семантика? Семантика оператора - это его смысл

Мы с вами по разному понимаем слово семантика. Я вкладываю в него не смысл, а то, что конкретно делает данная сущность (строгое определение во всех деталях), иными словами --- описание изменения состояния машины после выполнение данной сущности. А смысл я называю спецификацией (пример: +. Спецификация: сложить два числа. Семантика: записывает в стек сумму двух чисел без побочных эффектов). В этом случае, перегружать, не меняя семантики --- значит, писать тавтологичный код.

PM MAIL   Вверх
Fazil6
Дата 10.6.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(d06osipov @  10.6.2008,  10:08 Найти цитируемый пост)
А смысл я называю спецификацией (пример: +. Спецификация: сложить два числа. Семантика: записывает в стек сумму двух чисел без побочных эффектов). 

Не понимаю. В чем тогда по-твоему изменение семантики при перегрузке "+" для каких-нибудь объектов учитывая, что спецификация не изменилась(сложить два объекта)?
PM MAIL   Вверх
Alek86
Дата 10.6.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(d06osipov @  10.6.2008,  10:08 Найти цитируемый пост)
Я вкладываю в него не смысл, а то, что конкретно делает данная сущность (строгое определение во всех деталях), иными словами --- описание изменения состояния машины после выполнение данной сущности. А смысл я называю спецификацией

значит для тебя перегрузка оператора не должна менять его спецификацию
а для оператора "," это не возможно 


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 10.6.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

std::vector<std::string> buffers;
std::string s;
while (std::getline(std::cin, s), !std::cin.eof())
{
  buffers.push_back(s);

}

как это будет работать?
т.е сначала выполняется std::getline(std::cin, s), потом !std::cin.eof(), а что проверяется в while? возвращаемое значение std::getline(std::cin, s)?



--------------------
Мой блог
PM MAIL WWW   Вверх
Fazil6
Дата 10.6.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(vinter @  10.6.2008,  11:17 Найти цитируемый пост)
а что проверяется в while?

последнее, т.е. !std::cin.eof()
PM MAIL   Вверх
Любитель
Дата 10.6.2008, 12:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Fazil6 @  10.6.2008,  09:58 Найти цитируемый пост)
конечно. Именно так  и нужно перегружать. Что по твоему семантика? Семантика оператора - это его смысл. Смысл оператора "+" в сложении. Вот и перегружать его надо так, чтобы он по смыслу делал сложение. Где тут изменение семантики?

В большинстве случаев это верно. Но иногда удобна перегрузка без следования этим правилам. boost::asign, boost::lambda, boost::optiona, etc. - в качестве примеров.


--------------------
PM MAIL ICQ Skype   Вверх
andrew_121
Дата 10.6.2008, 12:45 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Это дискуссия, безконечна...
Спорить не буду, за - то же.
Как не крути, но в перегрузке "oprator ," больше негатива, чем позитива.
Так же, перегрузка "||" и "&&" вносит больше подозрений, непонятки, в код ее использующий. Зачем забивать себе голову еще и тем что, нужно помнить что эти операторы перегружены, когда и так у программера в голове, полно всякой полезной, и безполезной информации. Ведь проще написать пару лишних строк, чем забивать себе голову...(имхо)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
JackYF
Дата 10.6.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(vinter @  10.6.2008,  10:17 Найти цитируемый пост)
а что проверяется в while?

оператор "запятая" возвращает значение последнего аргумента smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Lazin
Дата 10.6.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(JackYF @  10.6.2008,  15:04 Найти цитируемый пост)
оператор "запятая" возвращает значение последнего аргумента

неперегруженый, а перегруженый, может вернуть что угодно smile
PM MAIL Skype GTalk   Вверх
d06osipov
Дата 10.6.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Alek86 @  10.6.2008,  10:36 Найти цитируемый пост)
значит для тебя перегрузка оператора не должна менять его спецификацию
а для оператора "," это не возможно  

Согласен. Но в большинстве случаев, программист знает, на что он идёт. И, скажем, если вы разрабатываете библиотеку, перегрузка оператора "," может испортить программу при подключении только в том случае, если:
1. Этот оператор объявлен все namespace, или используется using namespace (в противном случае, при уже существующей встроенной реализации "," будет выбираться пользовательская только в том случае, когда один из операндов имеет тип, находящийся в этом namespace, что не навредит. См. разрешение имён)
2. Этот оператор объявлен для типов, существующих вне библиотеки, например:
template<class T,class S>
T& operator , (const T&,const S&); //так делать не надо

В Boost этот оператор применяется при левом аргументе имеющем совершенно скрытый тип, о котором пользователь даже не знает. Следовательно, этот оператор не может помешать правильной работе программы. 

Оператор "," полезно использовать вместо эллипса! Но надо быть осторожнsм, чтобы компилятор не воспринял , за знак отделения аргументов функции:
Код

class A{};
inline A operator , (A l, A r){return l;}

int f(A)
{
}

int main()
{A a1,a2;
  f(a1,a2); //неверно!
  f((a1,a2)); //вот так
  return 0;
}



Т. о. Перегружать оператор , следует только в том случае, когда тип одного из операндов --- класс, к которому больше никак обращаться не следует.

PM MAIL   Вверх
Alek86
Дата 10.6.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(d06osipov @  10.6.2008,  15:49 Найти цитируемый пост)
Но надо быть осторожнsм, чтобы компилятор не воспринял , за знак отделения аргументов функции

помойму это совсем не обязательно, ведь сначала компилер "примеряет" юзерские переопределения, а только потом подставяляет стандартные


--------------------
user posted image    user posted image
PM MAIL   Вверх
Любитель
Дата 10.6.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Нет, как раз в данном случае сработает вызов функции с двумя параметрами. Поэтому использование запятой как подмены функции с произвольным количеством параметров - не лучшее решение smile


--------------------
PM MAIL ICQ Skype   Вверх
d06osipov
Дата 10.6.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Alek86 @  10.6.2008,  16:11 Найти цитируемый пост)
помойму это совсем не обязательно, ведь сначала компилер "примеряет" юзерские переопределения, а только потом подставяляет стандартные 


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


Это сообщение отредактировал(а) d06osipov - 10.6.2008, 16:53
PM MAIL   Вверх
Fazil6
Дата 11.6.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(d06osipov @  10.6.2008,  16:53 Найти цитируемый пост)
Не знаю, оговорено ли это явно в Стандарте

оговорено. в аргументах без скобок запятая не оператор
PM MAIL   Вверх
vinter
Дата 11.6.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



ммм, всем спасибо за ответы. Спор помоему пошел ни о чем.
Подведу итог: использование запятой ухудшает читабельность кода, но в некоторых случаех запятая удобна(перегруженная) как в случае с boost.
Всем спасибо за ответы.


--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1646 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.