<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Различия в языках программирования C и C++]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=14167</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=14167&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Различия в языках программирования C и C++».]]></description>
		<lastBuildDate>Fri, 10 Jun 2011 08:09:46 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=186596#p186596</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются &quot;операторы&quot;... так что голову этим можно себе не забивать.</p></blockquote></div><p>угу. вот только не следует думать, что если ваш класс отлично работает с типом int, то вы можете отдать его другим программистам, и он будет хоть как-то работать с их типами. Сила С++ в том и заключается, что можно один раз написать класс который сортирует, а потом им сортировать что угодно. Если &quot;не забивать голову&quot;, то ваш класс никому будет не нужен. В том числе и вам. Ибо отсортировать ваши инты проще без создания отдельного класса только для этого.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Fri, 10 Jun 2011 08:09:46 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=186596#p186596</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=186594#p186594</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Fri, 10 Jun 2011 08:04:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=186594#p186594</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185853#p185853</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Tue, 07 Jun 2011 11:32:22 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185853#p185853</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185846#p185846</link>
			<description><![CDATA[<p>я не понял.<br />в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?<br />он жеж структурный.. нет классов.. за счет чего длинна кода равная?</p>]]></description>
			<author><![CDATA[null@example.com (сантехник)]]></author>
			<pubDate>Tue, 07 Jun 2011 11:09:28 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185846#p185846</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185688#p185688</link>
			<description><![CDATA[<p><strong>Fat-Zer</strong>, Basic вроде бы...<br />Delphi очень похоже.</p>]]></description>
			<author><![CDATA[null@example.com (Wolfenberg)]]></author>
			<pubDate>Tue, 07 Jun 2011 00:53:55 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185688#p185688</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185681#p185681</link>
			<description><![CDATA[<div class="quotebox"><cite>mycetophylax пишет:</cite><blockquote><p>Ни фига подобного</p></blockquote></div><p>моя ошибка... перепутал с чем-то... в каком-то ЯП можно даже наследовать от базовых типов(в каком не помню...)</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Tue, 07 Jun 2011 00:20:35 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185681#p185681</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185646#p185646</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (mycetophylax)]]></author>
			<pubDate>Mon, 06 Jun 2011 18:48:11 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185646#p185646</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185466#p185466</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 06 Jun 2011 05:33:51 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185466#p185466</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185465#p185465</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 06 Jun 2011 05:27:18 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185465#p185465</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185392#p185392</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>но ИРЛ отичий от си нет...</p></blockquote></div><p>в том-то и дело, что IRL&nbsp; с int никто дела не имеет...</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Sun, 05 Jun 2011 17:12:47 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185392#p185392</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185327#p185327</link>
			<description><![CDATA[<p>нагуглил стандарт 98-го года... похоже всё так и есть, т.е. при записи &quot;int a;&quot; идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sun, 05 Jun 2011 10:43:56 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185327#p185327</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185311#p185311</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например</p></blockquote></div><p>глупый вопрос, а где стандарт скачать?</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sun, 05 Jun 2011 09:45:18 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185311#p185311</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185309#p185309</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Sun, 05 Jun 2011 09:34:22 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185309#p185309</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185304#p185304</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Sun, 05 Jun 2011 09:18:10 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185304#p185304</guid>
		</item>
		<item>
			<title><![CDATA[Re: Различия в языках программирования C и C++]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=185302#p185302</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Sun, 05 Jun 2011 09:12:57 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=185302#p185302</guid>
		</item>
	</channel>
</rss>
