LinuxForum.Fans
Тема

Различия в языках программирования C и C++

Автор: u__________10 42 сообщений 6418 просмотров
#167674

Wolfenberg, дело в том, что и C# и J# к веб-платформам отношение имеет весьма отдалённое... всё это языки для M$.Net.

#167675
Wolfenberg написал:
3. С# - язык программирования, основанный на С, но ориентирован исключительно на веб-платформы smile

вот мужики то не знают. Пишут на нем игры 3D под XNA и ПО для офисов -)

mogul82 написал:
основанный на С

на яве он основан


_

#167685
mogul82 написал:
Бездоказательно как то

докажу.

В языке Си имеется две сущности:
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 в С++.

Так получается из-за появление точки следования, ибо в С++ нет чисел, а есть только КЛАССЫ и их МЕТОДЫ.

Wolfenberg написал:
Это позволяет избежать огромного кода, неизбежного пр применении С.

это на каких курсах вам подобную глупость сказали? лишний код появляется тогда, и только тогда, когда вы используете не тот инструмент. Например ООП язык для решения не ООП задачи и наоборот.

Wolfenberg написал:
drBatty, если вы знаете только PHP, то это ваши пробелы.
Web: PHP, HTML, XML, Java Script, VB Script, C#, J#, Rev...

HTML и XML это вообще не языки программирования. Не дай вам б-г ляпнуть подобную глупость кому-то другому :(
C# это не web, это маздайное УГ, которое маздайщики применяют для мадайных быдлосайтов за не имением лучшего.

Да и вообще, мы тут не про скрипты...

#167687
Fat-Zer написал:
Идея С++ в том что он практически полностью совместим с си, однако является совершенно другим (объектно-ориентированным) по сути.

да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами. Многие программы на C работают и на C++, но исключительно только благодаря имитации. Код порождённый компилятором с плюсами в корне отличается от кода без плюсов. И только благодаря оптимизации иногда получается одно и тоже.

#167690
Wolfenberg написал:
mogul82, да ну? А здесь по-другому пишут:
http://ru.wikipedia.org/wiki/C_Sharp
Вот автор-то не знает

мне подправить, а вообще не вижу, где это написано...mogul82 прав: смесь C++, java и больной фантазии мелкомягких. Хотя и не такой $@%$^ой как C++/CLI...

drBatty написал:
Например, я уже писал про код x-- - --x;
В теории, в Си, этот код можно выполнить тремя способами, и получить три разных результата (0, 1, и 2).

по логике он может вернуть 0 1 и 2, а на практике он может вернуть 100500 и это будет верно.

drBatty написал:
Операции 1 и 2 могут выполнятся в любом порядке или одновременно - результат однозначный x-- - --x == 1 в С++.

авот мой глупый gcc говорит, что это будет 0... а ещё где-то читал, что это UB. smile

#167697
drBatty написал:
да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами.

вас опять понесло? это в java так вроде, а с++ такой ерундой не должен занимается... а вообще насчёт этого не уверен...есть какой-то пруфф? или какой код, в котором в ассемблированном виде имеет значительные различия...

#167698
Fat-Zer написал:
по логике он может вернуть 0 1 и 2, а на практике он может вернуть 100500 и это будет верно.

не. для классического компьютера только 0, 1, или 2. Для неклассического действительно 100500 может. А может и диск форматнуть. smile

Fat-Zer написал:
авот мой глупый gcc говорит, что это будет 0...

1) а что говорит ваш g++?
2) x это у вас константа? Тогда и x-- - --x; тоже константа, и вычисление происходит на этапе компиляции (а не в рантайме). Причём на этапе компиляции константные целые выражения вычисляются в точности как в С, с самой высокой степенью оптимизации. А в этих условиях получается именно 0.

Fat-Zer написал:
а ещё где-то читал, что это UB.

а вам об этом компилятор ваш разве не сказал? oO
мой меня за такое быдлокодером в открытую обзывает wink
Конечно UB. Но вот только не в С++.
Точнее говоря, я точно не знаю, является-ли этот быдлокод UB с т.з. стандарта C++, или нет. С++ вообще довольно запутанный язык, и написать быдлокод на нём куда как проще. (и часто компилятор молчит в тряпочку).

#167700
Fat-Zer написал:
вас опять понесло? это в java так вроде

про джаву - не в курсе.

Fat-Zer написал:
а с++ такой ерундой не должен занимается... а вообще насчёт этого не уверен...есть какой-то пруфф? или какой код, в котором в ассемблированном виде имеет значительные различия...

ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например
int x = 17;
это на самом деле
int x(17);
т.е. вызов конструктора по умолчанию. Естественно, на деле вызывается конструктор копирования по умолчанию, и в коде это выглядит точно так-же.

#167704
drBatty написал:
1) а что говорит ваш g++?
2) x это у вас константа? Тогда и x-- - --x; тоже константа, и вычисление происходит на этапе компиляции (а не в рантайме). Причём на этапе компиляции константные целые выражения вычисляются в точности как в С, с самой высокой степенью оптимизации. А в этих условиях получается именно 0.

он это и говорит... пробовал и так, и эдак...

drBatty написал:
а вам об этом компилятор ваш разве не сказал?

не пишу -Wall по всем мелочам))

drBatty написал:
С++ вообще довольно запутанный язык, и написать быдлокод на нём куда как проще.

си не такой запутанный, но написать на нём быдлокод ещё проще smile

ЗЫ: ещё один UB:

text
x = y =  x-- - --x;

у меня x = -1; y=0; в общем причины понятны, но смотрится забавно smile

#167706
drBatty написал:
ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например

глупый вопрос, а где стандарт скачать?

#167722

нагуглил стандарт 98-го года... похоже всё так и есть, т.е. при записи "int a;" идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...

#167787
Fat-Zer написал:
но ИРЛ отичий от си нет...

в том-то и дело, что IRL с int никто дела не имеет...

#167857
Fat-Zer написал:
т.е. при записи "int a;" идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...

тут основное отличие в том, что вообще говоря, в С++ пишется

text
int x(17);// конструктор копий int::int(int)

а в Си

text
int x = 17;/* обявление переменной x и запись туда 17и */

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

text
class foo
{
 private:
  const foo &operator=(const foo &) {}
  foo(const foo &) {}
 public:
};

пользователь класса лишается возможности случайно сделать копию.

Тут про наследование говорили - те ещё вилы :(
Дело в том, что деструктор не наследуется в базовом классе от производного. Потому, если в производном классе выделено 100500 памяти, и уничтожается объект как базовый (обычная практика) - привет утечки памяти :(
Лекарство - надо делать виртуальные деструкторы. (виртуальные нормально наследуются).

#167858

ну и опять таки: в Си есть операторы (+,-,%,^...), а вот в С++ есть методы (которые, ЧСХ, называются oerator'ы). В итоге:

text
x = y + z; /* складываем y с z, и результат пишем в x */

А в С++

text
x = y + z;// эквивалентно
x.operator=(y.operator+(z));// причём все эти операторы могут быть разные, для разных x, y и z.
// ИЧСХ по умолчанию задан лишь operator=, и то, всего один
// ИЧСОХ для встроенных типов есть встроенные операторы, которые работают почти как в Си
#168023
Fat-Zer написал:
[quote=drBatty]да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами.

вас опять понесло? это в java так вроде[/quote]
Ни фига подобного wink

#168058
mycetophylax написал:
Ни фига подобного

моя ошибка... перепутал с чем-то... в каком-то ЯП можно даже наследовать от базовых типов(в каком не помню...)

#168062

Fat-Zer, Basic вроде бы...
Delphi очень похоже.

#168214

я не понял.
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?
он жеж структурный.. нет классов.. за счет чего длинна кода равная?

#168221
Wolfenberg написал:
Basic вроде бы...
Delphi очень похоже.

странно... ни то ни другое почти не знаю))

сантехник написал:
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?

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

Войдите или зарегистрируйтесь, чтобы ответить.