Здравствуйте, VladD2, Вы писали:
ANS>>Так и нужно было писать не "В том же SQL-е это сплошь и рядом.", а "В том же MS SQL Server-е это сплошь и рядом." VD>Это не единственный сервер. Просто про него я точно помню.
Хороша ж конкатенация:
C:\...crosoft SQL Server\80\Tools\Binn>OSQL.EXE -U sa
Password:
1> SELECT 12 + '13';
2> go
-----------
25
Здравствуйте, VladD2, Вы писали:
VD>Я тебе по сикрету скажу, что некоторые товарищи для помещения значений в потоки операторы побитовых сдвигов испоьзуют.
Я думаю, что у этих товарищей понятие сдвига и ввода-вывода ассоциируются.
Более того, в большинстве случаев, когда мне нужно было писать именно реализацию ввода вывода... ты будешь смеяться, но как раз все входные данные побитово и задвигал куда-нить во внешний канал, или выдвигал оттуда.
Правда, что весьма напрягало, так это то, что направление сдвига противоположно сигнатуре оператора, ибо преобладают протоколы с передачей начиная от младших бит.
Здравствуйте, adontz, Вы писали:
A>А чем ты IL смотришь? Просто лично я гляжу ассемблерный код EXE'шника.
Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...
Здравствуйте, Кодёнок, Вы писали:
A>>Побитовое И? Кё>Просто "И". Это у тебя привычка так о нем думать, потому что для целых оно побитовое.
А у тебя привычка так думать о +, потому что для целых оно означает сложение.
A>>В ПХП, например, — это точка. Но точка там, насколько я помню, не используется для доступа к членам класса, поэтому вполне допустима с этой точки зрения. В Си++ я не вижу символа более подходящего, чем +. Кё>Это для строки. А для последовательности или матрицы появляется упомянутый Трурлем конфликт.
Сложение векторов и матриц — это вполне стандартная операция именно поэлементного сложения. И она законно обозначается символом +. Никаких конфликтов я не вижу.
Дело в том, что большинство языков моделируются именно под математику. Вот мы тут оперируем такими понятиями как массив, множество, последовательность, вектор, матрица, строка (string). На мой взгляд, картина следующая:
Массив, список. Не моделирует ничего. Просто упорядоченный набор данных.
Математические операции неприменимы. Но вроде как должна быть операция соединения. Как лучше ее обозначить... Наверное все-таки +.
Множество. Набор элементов, необязательно однотипных.
Для множества существуют следующие основные математические операции:
Объединение. Математический знак не выражается в ASCII (похож на заглавную U). Наиболее уместным по смыслу считаю |.
Пересечение. Математический знак не выражается в ASCII (похож на перевернутую заглавную U). Наиболее уместным по смыслу считаю &.
Разность. Математический знак: \.
В случае, когда элементами являются числами, либо другие однотипные объекты к которым применимы следующие операции: поэлементное сложение, разность, произведение, частное (множество всех возможных сумм, разностей, произведений, частных элементов). Математический знак: +, -, / :, · (для удобства заменяется *).
Декартово произведение — не выражается в ASCII (похоже на латинскую x). Варианты приветсвуются.
Вектор. Упорядоченный набор координат (по-моему, допустимы только числа) в n-мерном пространстве (либо в бесконечномерном).
Для вектора существуют следующие основные математические операции:
Сумма (покомпонентное сложение). Математический знак: +.
Разность (покомпонентная разность, если не ошибаюсь). Математический знак: -.
Скалярное произведение. Математический знак: ·, "пустой символ", а так же скобки. Пока используется только первый, но для удобства заменяется *.
Векторное произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Варианты опять же приветсвуются.
Матрица. Примерное определение сочинить не в силах почему-то . Ну, скажем табличка из чисел .
Для матрицы существуют следующие основные математические операции:
Сумма (покомпонентное сложение). Математический знак: +.
Разность (покомпонентная разность). Математический знак: -.
Произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Заменяется на *.
Такие операции, как транспонирование, обращение и пр. приходится выражать функциями (т.е. символьными именами).
Последовательность. Упорядоченный набор однотипных объектов.
Для последовательности существуют следующие основные математические операции:
Строка. Упорядоченный набор символов. Нет аналога в математике.
Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
Конкатенация (слияние). Знак: +. Не коммутативно.
Такие операции, как возведение в верхний/нижний регистр, индекс вхождения подстроки и пр. приходится выражать символьными именами.
Почти все эти объекты — просто иное толкование массива, или списка (ну или двумерных в случае матрицы). Т.е. физически — это все одно и то же, но семантически — это разные вещи. Вопрос в том, что нужно вам?
Это стандартные обозначения, которые думаю знает каждый. Если надо нечто такое, что не попадает ни под один из этих объектов, то вся ответственность по выбору символов операций и их семантике полностью на вашей совести.
Кё>Вообще давайте отличать значение символа от своих привычек Амперсанд, обозначает союз "и" (et), который почти всегда (кроме битовых и логических операций, которые суть одно и то же) обозначает соединение оригинальных объектов вместо, а вот за плюсом стоит создание нового объекта.
Каждая операция порождает новый объект. Вопрос лишь в том КАКИМ ОБРАЗОМ.
Кё>Возможность вводить новые типы (ПОЛНОПРАВНЫЕ с встроенными) тоже увеличивает выразительность, и перегрузка операций просто обязана сопутствовать этой возможности. Иначе они не будут полноправными Автор стати выдумал какие-то мифические проблемы.
Согласен. Пошел спать
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Metallica — Fade To Black";
Здравствуйте, Oyster, Вы писали:
O>Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...
Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление). Вот сгенерированный ассемблерный код я и глядел
Здравствуйте, StanislavK, Вы писали:
SK>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
Есть такое скромное понятие — выразительность языка. Некоторые "нежадные" языки позволяют делиться с нами этой выразительностью в виде возможности перегрузки операций для собственных типов.
Я думаю, что в школе, ты бы не далеко ушел даже в начальной математике, если бы все детcво писал вместо A*(B+C) нечто вроде этого набора бреда: A.MULTIPLY(B.PLUS(C)). А как именно бы ты изучал тему раскрытия скобок и упрощения выражений в 4-м классе — вообще не понятно.
Для человека все еще критично такое понятие — как способность к восприятию информации. Соответственно, желательно так представлять информацию, что бы она воспринималась наилучшим образом.
Здравствуйте, adontz, Вы писали:
O>>Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...
A>Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление).
Это я и назвал "исполнение IL рантаймом". И ежу понятно, что неспециализированный процессор IL-код не проглотит.
A>Вот сгенерированный ассемблерный код я и глядел
С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?
Здравствуйте, ansi, Вы писали:
A> Строка. Упорядоченный набор символов. Нет аналога в математике. A>Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция: A>[list] A> Конкатенация (слияние). Знак: +. Не коммутативно.
В математике есть строки, а операция конкатенации обычно не обозначется (реже обозначется ||).
Здравствуйте, Oyster, Вы писали:
A>>Вот сгенерированный ассемблерный код я и глядел O>С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?
Debug\Windows\Disassembly. Для того чтобы поглядеть в релизе надо unmanaged debugging включить.
Здравствуйте, adontz, Вы писали:
O>>С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?
A>Debug\Windows\Disassembly. Для того чтобы поглядеть в релизе надо unmanaged debugging включить.
Ну вот. Увидел в Disassembly Window вот такой код:
Здравствуйте, ansi, Вы писали:
A>[list=1] A> Массив, список. Не моделирует ничего. Просто упорядоченный набор данных. A>Математические операции неприменимы. Но вроде как должна быть операция соединения. Как лучше ее обозначить... Наверное все-таки +.
Чем лучше-то? Тем, что когда-то кто-то не подумав стал ее для этого использовать? Конкатенация объектов есть в математике (это суперпозиция функций, например) и она обладает определенными свойствами — например, ассоциативностью, нулевым элементом.
A> Вектор. Упорядоченный набор координат (по-моему, допустимы только числа) в n-мерном пространстве (либо в бесконечномерном). A>Для вектора существуют следующие основные математические операции: A>
A> Сумма (покомпонентное сложение). Математический знак: +. A> Разность (покомпонентная разность, если не ошибаюсь). Математический знак: -. A> Скалярное произведение. Математический знак: ·, "пустой символ", а так же скобки. Пока используется только первый, но для удобства заменяется *. A> Векторное произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Варианты опять же приветсвуются. A>
Вектор — это просто одномерный массив, а по простому отображение множества {1..N} в множество некоторых элементов. В твоем примере сразу виден порочный подход к перегрузке операторов, типичный для "свободного" С++ника. Арифметическое произведение использовано для скалярного произведения, чем сразу же нарушаются все мыслимые свойства операции *, которые мы вправе от нее ожидать. Использовать * для векторного произведения тоже нельзя, поскольку векторное произведение не коммутативно.
A> Матрица. Примерное определение сочинить не в силах почему-то . Ну, скажем табличка из чисел . A>Для матрицы существуют следующие основные математические операции: A>
A> Сумма (покомпонентное сложение). Математический знак: +. A> Разность (покомпонентная разность). Математический знак: -. A> Произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Заменяется на *. A>A>Такие операции, как транспонирование, обращение и пр. приходится выражать функциями (т.е. символьными именами).
Матрица — это тоже самое, что вектор, только отображение будет из {1...N}*{1...M} -> A.
Сумма и разность, естественно, будут работать, поскольку это группа. Но умножение не коммутативно, что легко может ввести в заблуждение.
A> Строка. Упорядоченный набор символов. Нет аналога в математике. A>Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция: A>
A> Конкатенация (слияние). Знак: +. Не коммутативно. A>
Есть аналог. В частности в теории грамматик. Естественно, арифметические операции над строками смысла не имеют, поэтому не надо использовать символ арифметической операции для конкатенации строк.
A>Почти все эти объекты — просто иное толкование массива, или списка (ну или двумерных в случае матрицы). Т.е. физически — это все одно и то же, но семантически — это разные вещи. Вопрос в том, что нужно вам?
Нет, все это частные случаи отображений в случае теории множеств.
A>Это стандартные обозначения, которые думаю знает каждый. Если надо нечто такое, что не попадает ни под один из этих объектов, то вся ответственность по выбору символов операций и их семантике полностью на вашей совести.
В математике есть определенная иерархия структур типа полугруппа, группа, ассоциативная группа, полукольцо, кольцо и т.д. Все что встречается на практике неизбежно попадает под одно из определений, так что особо думать не надо.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Мне не мешает управление памятью. Наоборот — красивое решение содержит в себе элегантное управление памятью (вернее — жизненным циклом объектов, а не памятью как таковой) как неотъемлемую часть. И не надо сравнивать с математикой — любая формула из ВМ включает в себя элементарные операции сложения/умножения.
Если бы каждый элегантно разрабатывал бы болты под себя, а не пользовался набором стандартных, то цивилизации не существовало бы. Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.
Здравствуйте, adontz, Вы писали:
A>Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.
Это вы намекаете, что С++ существует только для "посвященных" в тайные знания программистов, элиты мирого кодирования. Если так, что же на нем пишут все кому не лень?
Q>>Ну использовать + для "сложения" строк вам же приходит в голову, хотя конкатенация строк к сложению никакого отношения не имеет. A>Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый.
Бредовое обозначение, и то, что оно почему-то употребляется в С++, меня не волнует.
Здравствуйте, VladD2, Вы писали:
VD>Есть такая штука — практика. И она показывает, что никаких проблем перегрузка не вызывает. На практике никто не кидается перегружать все какие можно операторы для все попавшихся под руку типов. Те кто может навалять дурака просто недодумываются применить это средство.
Никаких доказательств этим утверждениям нет, поэтому стоит убрать из рассмотрения.
Здравствуйте, Quintanar, Вы писали:
A>>Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.
Q>Это вы намекаете, что С++ существует только для "посвященных" в тайные знания программистов, элиты мирого кодирования. Если так, что же на нем пишут все кому не лень?
Собственно а кто сказал, что на нём все кому не лень пишут? На Си++ пишет не так уж много людей. Вот на "Си с классами" огромное количество.
A>>Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый. Q>Бредовое обозначение, и то, что оно почему-то употребляется в С++, меня не волнует.
Ну да. появилось обозначение не в Си++, язык его только перенял, но виноват Си++. Главное точно известны виноватые.