Wolfenberg, дело в том, что и C# и J# к веб-платформам отношение имеет весьма отдалённое... всё это языки для M$.Net.
Различия в языках программирования C и C++
3. С# - язык программирования, основанный на С, но ориентирован исключительно на веб-платформы smile
вот мужики то не знают. Пишут на нем игры 3D под XNA и ПО для офисов -)
основанный на С
на яве он основан
_
mogul82, да ну? А здесь по-другому пишут:
http://ru.wikipedia.org/wiki/C_Sharp wink
Вот автор-то не знает smile
Бездоказательно как то
докажу.
В языке Си имеется две сущности:
1) подчинённая сущность ЧИСЛО,
2) и главная сущность ФУНКЦИЯ.
Программист пишет ФУНКЦИИ, которые обрабатывают ЧИСЛА (сами, или другими ФУНКЦИЯМИ).
В С++ нету этих сущностей. За то есть другие:
1) главная сущность КЛАСС.
2) подчинённая сущность МЕТОД.
Программист пишет КЛАССЫ, которые включают в себя другие КЛАССЫ, а так-же МЕТОДЫ. МЕТОД в С++ не существует сам по себе, а прибит гвоздями к КЛАССУ. В Си напротив - ЧИСЛА не существуют сами по себе, а жёстко прибиты к ФУНКЦИЯМ.
В С++ имеются особые, встроенные классы. Например встроенный класс int, у которого имеется встроенный метод int::operator-(int). С виду, этот оператор работает также, как и в Си, но это только на первый взгляд. Если ситуация чуть сложнее примитивной, всё меняется. Например, я уже писал про код x-- - --x;
В теории, в Си, этот код можно выполнить тремя способами, и получить три разных результата (0, 1, и 2). Но это для классического компьютера. А у нас - НЕ классический. Потому компилятор применяет (не всегда) четвёртый путь - он ОДНОВРЕМЕННО выполняет постфиксный декремент ЧИСЛА, вместе с префиксным декрементом и последующим вычитанием ЧИСЕЛ.
Но в С++ нет ЧИСЕЛ, а есть КЛАССЫ. Именно по этой причине данное выражение в С++ вычисляется однозначно как
1 - x.operator--();
2 - x.operator-(x.operator--(int));
Операции 1 и 2 могут выполнятся в любом порядке или одновременно - результат однозначный x-- - --x == 1 в С++.
Так получается из-за появление точки следования, ибо в С++ нет чисел, а есть только КЛАССЫ и их МЕТОДЫ.
Это позволяет избежать огромного кода, неизбежного пр применении С.
это на каких курсах вам подобную глупость сказали? лишний код появляется тогда, и только тогда, когда вы используете не тот инструмент. Например ООП язык для решения не ООП задачи и наоборот.
drBatty, если вы знаете только PHP, то это ваши пробелы.
Web: PHP, HTML, XML, Java Script, VB Script, C#, J#, Rev...
HTML и XML это вообще не языки программирования. Не дай вам б-г ляпнуть подобную глупость кому-то другому :(
C# это не web, это маздайное УГ, которое маздайщики применяют для мадайных быдлосайтов за не имением лучшего.
Да и вообще, мы тут не про скрипты...
Идея С++ в том что он практически полностью совместим с си, однако является совершенно другим (объектно-ориентированным) по сути.
да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами. Многие программы на C работают и на C++, но исключительно только благодаря имитации. Код порождённый компилятором с плюсами в корне отличается от кода без плюсов. И только благодаря оптимизации иногда получается одно и тоже.
mogul82, да ну? А здесь по-другому пишут:
http://ru.wikipedia.org/wiki/C_Sharp
Вот автор-то не знает
мне подправить, а вообще не вижу, где это написано...mogul82 прав: смесь C++, java и больной фантазии мелкомягких. Хотя и не такой $@%$^ой как C++/CLI...
Например, я уже писал про код x-- - --x;
В теории, в Си, этот код можно выполнить тремя способами, и получить три разных результата (0, 1, и 2).
по логике он может вернуть 0 1 и 2, а на практике он может вернуть 100500 и это будет верно.
Операции 1 и 2 могут выполнятся в любом порядке или одновременно - результат однозначный x-- - --x == 1 в С++.
авот мой глупый gcc говорит, что это будет 0... а ещё где-то читал, что это UB. smile
да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами.
вас опять понесло? это в java так вроде, а с++ такой ерундой не должен занимается... а вообще насчёт этого не уверен...есть какой-то пруфф? или какой код, в котором в ассемблированном виде имеет значительные различия...
по логике он может вернуть 0 1 и 2, а на практике он может вернуть 100500 и это будет верно.
не. для классического компьютера только 0, 1, или 2. Для неклассического действительно 100500 может. А может и диск форматнуть. smile
авот мой глупый gcc говорит, что это будет 0...
1) а что говорит ваш g++?
2) x это у вас константа? Тогда и x-- - --x; тоже константа, и вычисление происходит на этапе компиляции (а не в рантайме). Причём на этапе компиляции константные целые выражения вычисляются в точности как в С, с самой высокой степенью оптимизации. А в этих условиях получается именно 0.
а ещё где-то читал, что это UB.
а вам об этом компилятор ваш разве не сказал? oO
мой меня за такое быдлокодером в открытую обзывает wink
Конечно UB. Но вот только не в С++.
Точнее говоря, я точно не знаю, является-ли этот быдлокод UB с т.з. стандарта C++, или нет. С++ вообще довольно запутанный язык, и написать быдлокод на нём куда как проще. (и часто компилятор молчит в тряпочку).
вас опять понесло? это в java так вроде
про джаву - не в курсе.
а с++ такой ерундой не должен занимается... а вообще насчёт этого не уверен...есть какой-то пруфф? или какой код, в котором в ассемблированном виде имеет значительные различия...
ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например
int x = 17;
это на самом деле
int x(17);
т.е. вызов конструктора по умолчанию. Естественно, на деле вызывается конструктор копирования по умолчанию, и в коде это выглядит точно так-же.
1) а что говорит ваш g++?
2) x это у вас константа? Тогда и x-- - --x; тоже константа, и вычисление происходит на этапе компиляции (а не в рантайме). Причём на этапе компиляции константные целые выражения вычисляются в точности как в С, с самой высокой степенью оптимизации. А в этих условиях получается именно 0.
он это и говорит... пробовал и так, и эдак...
а вам об этом компилятор ваш разве не сказал?
не пишу -Wall по всем мелочам))
С++ вообще довольно запутанный язык, и написать быдлокод на нём куда как проще.
си не такой запутанный, но написать на нём быдлокод ещё проще smile
ЗЫ: ещё один UB:
x = y = x-- - --x;у меня x = -1; y=0; в общем причины понятны, но смотрится забавно smile
ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например
глупый вопрос, а где стандарт скачать?
нагуглил стандарт 98-го года... похоже всё так и есть, т.е. при записи "int a;" идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...
но ИРЛ отичий от си нет...
в том-то и дело, что IRL с int никто дела не имеет...
т.е. при записи "int a;" идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...
тут основное отличие в том, что вообще говоря, в С++ пишется
int x(17);// конструктор копий int::int(int)а в Си
int x = 17;/* обявление переменной x и запись туда 17и */в ++ тоже можно как в Си, но это костыль для совместимости.
конструктор копий и оператор = в плюсах (для совместимости) заданы по умолчанию, и осуществляют копирование байт-в-байт. Эти грабли могут очень больно долбануть кодера по его глупой башке. Посему, обычно конструктор копий и оператор= закрываются:
class foo
{
private:
const foo &operator=(const foo &) {}
foo(const foo &) {}
public:
};
пользователь класса лишается возможности случайно сделать копию.
Тут про наследование говорили - те ещё вилы :(
Дело в том, что деструктор не наследуется в базовом классе от производного. Потому, если в производном классе выделено 100500 памяти, и уничтожается объект как базовый (обычная практика) - привет утечки памяти :(
Лекарство - надо делать виртуальные деструкторы. (виртуальные нормально наследуются).
ну и опять таки: в Си есть операторы (+,-,%,^...), а вот в С++ есть методы (которые, ЧСХ, называются oerator'ы). В итоге:
x = y + z; /* складываем y с z, и результат пишем в x */А в С++
x = y + z;// эквивалентно
x.operator=(y.operator+(z));// причём все эти операторы могут быть разные, для разных x, y и z.
// ИЧСХ по умолчанию задан лишь operator=, и то, всего один
// ИЧСОХ для встроенных типов есть встроенные операторы, которые работают почти как в Си
[quote=drBatty]да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами.
вас опять понесло? это в java так вроде[/quote]
Ни фига подобного wink
Ни фига подобного
моя ошибка... перепутал с чем-то... в каком-то ЯП можно даже наследовать от базовых типов(в каком не помню...)
Fat-Zer, Basic вроде бы...
Delphi очень похоже.
я не понял.
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?
он жеж структурный.. нет классов.. за счет чего длинна кода равная?
Basic вроде бы...
Delphi очень похоже.
странно... ни то ни другое почти не знаю))
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?
всё так только в теории... на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются "операторы"... так что голову этим можно себе не забивать. (ещё раз подчеркну, что речь идёт только о простых типах)