<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Различия в языках программирования C и C++]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=14167&amp;type=atom" />
	<updated>2011-06-10T08:09:46Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=14167</id>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=186596#p186596" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются &quot;операторы&quot;... так что голову этим можно себе не забивать.</p></blockquote></div><p>угу. вот только не следует думать, что если ваш класс отлично работает с типом int, то вы можете отдать его другим программистам, и он будет хоть как-то работать с их типами. Сила С++ в том и заключается, что можно один раз написать класс который сортирует, а потом им сортировать что угодно. Если &quot;не забивать голову&quot;, то ваш класс никому будет не нужен. В том числе и вам. Ибо отсортировать ваши инты проще без создания отдельного класса только для этого.</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-10T08:09:46Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=186596#p186596</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=186594#p186594" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>сантехник пишет:</cite><blockquote><p>в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?</p></blockquote></div><p>обычно длинна кода в С++ несколько больше. КАЖУЩАЯСЯ простота кода С++ объясняется просто: мы например можем использовать чужие классы, причём делать это очень элегантно. К примеру, у нас есть массив в С, мы хотим его отсортировать. Если в С для этого применить qsort (из стандартной либы), получится:<br /></p><div class="codebox"><pre><code>       #include &lt;stdio.h&gt;
       #include &lt;stdlib.h&gt;
       #include &lt;string.h&gt;

       static int
       cmpstringp(const void *p1, const void *p2)
       {
           /* The actual arguments to this function are &quot;pointers to
              pointers to char&quot;, but strcmp(3) arguments are &quot;pointers
              to char&quot;, hence the following cast plus dereference */

           return strcmp(* (char * const *) p1, * (char * const *) p2);
       }

       int
       main(int argc, char *argv[])
       {
           int j;

           if (argc &lt; 2) {
            fprintf(stderr, &quot;Usage: %s &lt;string&gt;...\n&quot;, argv[0]);
            exit(EXIT_FAILURE);
           }

           qsort(&amp;argv[1], argc - 1, sizeof(char *), cmpstringp);

           for (j = 1; j &lt; argc; j++)
               puts(argv[j]);
           exit(EXIT_SUCCESS);
       }</code></pre></div><p>Совсем другой коленкор, если мы имеем абстрактный базовый класс collection. Нам надо сделать следующее:<br />1) унаследовать свой класс element от класса collection_element<br />2) перезагрузить функцию collection_element::compare() своей element::compare()<br />3) и всё. теперь мы смело можем писать my_collection.qsort();</p><p>Вот только, qsort от этого не стала не проще, и не быстрее. (медленнее тоже не стала, ибо оптимизирующий компилятор выкинет весь лишний синтаксический мусор. И указатель на функцию так и останется, правда спрятанный в VTable экземпляра класса.).</p><div class="quotebox"><cite>сантехник пишет:</cite><blockquote><p>он жеж структурный.. нет классов.. за счет чего длинна кода равная?</p></blockquote></div><p>процессор всё равно не структурный, а функциональный. В процессоре нету никаких классов. Потому, из C++ получается что-то вроде C, а уж него - ассемблер.</p><p>В моём примере, на самом деле, компилятор превращает гламурное my_collection.qsort(); в готичное<br />qsort(&amp;argv[1], argc - 1, sizeof(char *), cmpstringp);<br />при этом, сам подставляет все эти ужасные типы, и сам заботится о деталях (в частности, куда указывает cmpstringp в данный момент времени. Это плюшка на самом деле приколочена к любому классу с виртуальными функциями. Только кодер её не видит. Но она есть. Дизассемблер вам поможет её увидеть.).</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-10T08:04:09Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=186594#p186594</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185853#p185853" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Wolfenberg пишет:</cite><blockquote><p>Basic вроде бы...<br />Delphi очень похоже.</p></blockquote></div><p>странно... ни то ни другое почти не знаю))<br /></p><div class="quotebox"><cite>сантехник пишет:</cite><blockquote><p>в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?</p></blockquote></div><p>всё так только в теории... на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются &quot;операторы&quot;... так что голову этим можно себе не забивать. (ещё раз подчеркну, что речь идёт только о простых типах)</p>]]></content>
			<author>
				<name><![CDATA[Fat-Zer]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11911</uri>
			</author>
			<updated>2011-06-07T11:32:22Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185853#p185853</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185846#p185846" />
			<content type="html"><![CDATA[<p>я не понял.<br />в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?<br />он жеж структурный.. нет классов.. за счет чего длинна кода равная?</p>]]></content>
			<author>
				<name><![CDATA[сантехник]]></name>
				<uri>https://linuxforum.ru/profile.php?id=10464</uri>
			</author>
			<updated>2011-06-07T11:09:28Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185846#p185846</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185688#p185688" />
			<content type="html"><![CDATA[<p><strong>Fat-Zer</strong>, Basic вроде бы...<br />Delphi очень похоже.</p>]]></content>
			<author>
				<name><![CDATA[Wolfenberg]]></name>
				<uri>https://linuxforum.ru/profile.php?id=9425</uri>
			</author>
			<updated>2011-06-07T00:53:55Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185688#p185688</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185681#p185681" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mycetophylax пишет:</cite><blockquote><p>Ни фига подобного</p></blockquote></div><p>моя ошибка... перепутал с чем-то... в каком-то ЯП можно даже наследовать от базовых типов(в каком не помню...)</p>]]></content>
			<author>
				<name><![CDATA[Fat-Zer]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11911</uri>
			</author>
			<updated>2011-06-07T00:20:35Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185681#p185681</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185646#p185646" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами.</p></blockquote></div><p>вас опять понесло? это в java так вроде</p></blockquote></div><p>Ни фига подобного&nbsp; wink</p>]]></content>
			<author>
				<name><![CDATA[mycetophylax]]></name>
				<uri>https://linuxforum.ru/profile.php?id=6380</uri>
			</author>
			<updated>2011-06-06T18:48:11Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185646#p185646</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185466#p185466" />
			<content type="html"><![CDATA[<p>ну и опять таки: в Си есть операторы (+,-,%,^...), а вот в С++ есть методы (которые, ЧСХ, называются oerator&#039;ы). В итоге:<br /></p><div class="codebox"><pre><code>x = y + z; /* складываем y с z, и результат пишем в x */</code></pre></div><p>А в С++<br /></p><div class="codebox"><pre><code>x = y + z;// эквивалентно
x.operator=(y.operator+(z));// причём все эти операторы могут быть разные, для разных x, y и z.
// ИЧСХ по умолчанию задан лишь operator=, и то, всего один
// ИЧСОХ для встроенных типов есть встроенные операторы, которые работают почти как в Си</code></pre></div>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-06T05:33:51Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185466#p185466</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185465#p185465" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p> т.е. при записи &quot;int a;&quot; идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...</p></blockquote></div><p>тут основное отличие в том, что вообще говоря, в С++ пишется<br /></p><div class="codebox"><pre><code>int x(17);// конструктор копий int::int(int)</code></pre></div><p>а в Си<br /></p><div class="codebox"><pre><code>int x = 17;/* обявление переменной x и запись туда 17и */</code></pre></div><p>в ++ тоже можно как в Си, но это костыль для совместимости.<br />конструктор копий и оператор = в плюсах (для совместимости) заданы по умолчанию, и осуществляют копирование байт-в-байт. Эти грабли могут очень больно долбануть кодера по его глупой башке. Посему, обычно конструктор копий и оператор= закрываются:<br /></p><div class="codebox"><pre><code>class foo
{
 private:
  const foo &amp;operator=(const foo &amp;) {}
  foo(const foo &amp;) {}
 public:
};</code></pre></div><p>пользователь класса лишается возможности случайно сделать копию.</p><p>Тут про наследование говорили - те ещё вилы&nbsp; <img src="https://linuxforum.ru/img/smilies/ac.gif" alt="ac" /> <br />Дело в том, что деструктор не наследуется в базовом классе от производного. Потому, если в производном классе выделено 100500 памяти, и уничтожается объект как базовый (обычная практика) - привет утечки памяти&nbsp; <img src="https://linuxforum.ru/img/smilies/ac.gif" alt="ac" /> <br />Лекарство - надо делать виртуальные деструкторы. (виртуальные нормально наследуются).</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-06T05:27:18Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185465#p185465</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185392#p185392" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>но ИРЛ отичий от си нет...</p></blockquote></div><p>в том-то и дело, что IRL&nbsp; с int никто дела не имеет...</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-05T17:12:47Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185392#p185392</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185327#p185327" />
			<content type="html"><![CDATA[<p>нагуглил стандарт 98-го года... похоже всё так и есть, т.е. при записи &quot;int a;&quot; идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...</p>]]></content>
			<author>
				<name><![CDATA[Fat-Zer]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11911</uri>
			</author>
			<updated>2011-06-05T10:43:56Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185327#p185327</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185311#p185311" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например</p></blockquote></div><p>глупый вопрос, а где стандарт скачать?</p>]]></content>
			<author>
				<name><![CDATA[Fat-Zer]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11911</uri>
			</author>
			<updated>2011-06-05T09:45:18Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185311#p185311</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185309#p185309" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>1) а что говорит ваш g++?<br />2) x это у вас константа? Тогда и x-- - --x; тоже константа, и вычисление происходит на этапе компиляции (а не в рантайме). Причём на этапе компиляции константные целые выражения вычисляются в точности как в С, с самой высокой степенью оптимизации. А в этих условиях получается именно 0.</p></blockquote></div><p>он это и говорит... пробовал и так, и эдак...<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>а вам об этом компилятор ваш разве не сказал?</p></blockquote></div><p>не пишу -Wall по всем мелочам))<br /></p><div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>С++ вообще довольно запутанный язык, и написать быдлокод на нём куда как проще.</p></blockquote></div><p>си не такой запутанный, но написать на нём быдлокод ещё проще smile </p><p>ЗЫ: ещё один UB:<br /></p><div class="codebox"><pre><code>x = y =  x-- - --x;</code></pre></div><p>у меня x = -1; y=0; в общем причины понятны, но смотрится забавно smile</p>]]></content>
			<author>
				<name><![CDATA[Fat-Zer]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11911</uri>
			</author>
			<updated>2011-06-05T09:34:22Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185309#p185309</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185304#p185304" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>вас опять понесло? это в java так вроде</p></blockquote></div><p>про джаву - не в курсе.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>а с++ такой ерундой не должен занимается... а вообще насчёт этого не уверен...есть какой-то пруфф? или какой код, в котором в ассемблированном виде имеет значительные различия...</p></blockquote></div><p>ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например<br />int x = 17;<br />это на самом деле<br />int x(17);<br />т.е. вызов конструктора по умолчанию. Естественно, на деле вызывается конструктор копирования по умолчанию, и в коде это выглядит точно так-же.</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-05T09:18:10Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185304#p185304</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=185302#p185302" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>по логике он может вернуть 0 1 и 2, а на практике он может вернуть 100500 и это будет верно.</p></blockquote></div><p>не. для классического компьютера только 0, 1, или 2. Для неклассического действительно 100500 может. А может и диск форматнуть.&nbsp; smile <br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>авот мой глупый gcc говорит, что это будет 0...</p></blockquote></div><p>1) а что говорит ваш <strong>g++</strong>?<br />2) <strong>x</strong> это у вас константа? Тогда и x-- - --x; тоже константа, и вычисление происходит на этапе компиляции (а не в рантайме). Причём на этапе компиляции константные целые выражения вычисляются в точности как в С, с самой высокой степенью оптимизации. А в этих условиях получается именно 0.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>а ещё где-то читал, что это UB.</p></blockquote></div><p>а вам об этом компилятор ваш разве не сказал?&nbsp; oO <br />мой меня за такое быдлокодером в открытую обзывает&nbsp; wink <br />Конечно UB. Но вот только не в С++.<br />Точнее говоря, я точно не знаю, является-ли этот быдлокод UB с т.з. стандарта C++, или нет. С++ вообще довольно запутанный язык, и написать быдлокод на нём куда как проще. (и часто компилятор молчит в тряпочку).</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2011-06-05T09:12:57Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=185302#p185302</id>
		</entry>
</feed>
