<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Электронный научно-практический журнал «Современные научные исследования и инновации» &#187; неоднозначность</title>
	<atom:link href="http://web.snauka.ru/issues/tag/neodnoznachnost/feed" rel="self" type="application/rss+xml" />
	<link>https://web.snauka.ru</link>
	<description></description>
	<lastBuildDate>Fri, 17 Apr 2026 07:29:22 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>О неоднозначности генерации кода компиляторами С++</title>
		<link>https://web.snauka.ru/issues/2014/04/33610</link>
		<comments>https://web.snauka.ru/issues/2014/04/33610#comments</comments>
		<pubDate>Mon, 28 Apr 2014 10:56:50 +0000</pubDate>
		<dc:creator>Дмитриев Владислав Леонидович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[C ++ programming language]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[indeterminacy]]></category>
		<category><![CDATA[input/output streams]]></category>
		<category><![CDATA[компилятор]]></category>
		<category><![CDATA[неоднозначность]]></category>
		<category><![CDATA[потоки ввода-вывода]]></category>
		<category><![CDATA[язык программирования С++]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/?p=33610</guid>
		<description><![CDATA[В большинстве случаев выбор компилятора обусловлен соображениями наибольшей популярности или удобства использования (а в некоторых случаях, возможно, и силой привычки). Одними из самых распространенных сред разработки программ на языке С++ являются компиляторы Borland C++ 5.02, wxDev C++ 7.4, Microsoft Visual C++. В некоторых случаях в зависимости от используемого компилятора можно получить прирост производительности до 10% [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">В большинстве случаев выбор компилятора обусловлен соображениями наибольшей популярности или удобства использования (а в некоторых случаях, возможно, и силой привычки). Одними из самых распространенных сред разработки программ на языке С++ являются компиляторы Borland C++ 5.02, wxDev C++ 7.4, Microsoft Visual C++. В некоторых случаях в зависимости от используемого компилятора можно получить прирост производительности до 10% и более (разумеется, в рамках решаемой задачи). Но сразу ответить на вопрос о том, какой компилятор выбрать, чтобы он сгенерировал код максимально правильно и быстро, к сожалению, невозможно. Дело в том, что одни компиляторы лучше оптимизируют виртуальные вызовы, другие – лучше работают с памятью. В силу проблем оптимизации многие компиляторы при этом часто ограничивают область анализа функциями и дополнительно к этому могут выполнять межпроцедурный анализ (англ. inter-procedural analysis, IPA), с целью удаления &#8220;мёртвого&#8221; кода (англ. dead code elimination, DCE) и недостижимого кода (англ. unreachable code elimination, UCE). Кроме того, в некоторых, даже самых простых ситуациях, могут возникать разного рода неоднозначности сбора проекта (программы) из программного кода при использовании разных компиляторов [1]. Ниже приводятся некоторые из таких типичных ситуаций.</p>
<p style="text-align: justify;"><span>Рассмотрим вначале пример простой программы, в которой осуществляется присваивание значений элементам одномерного массива, состоящего из четырех целых чисел. Ниже в таблице 1 показаны результаты выполнения программы, построенной отмеченными выше компиляторами.<br />
</span></p>
<p style="text-align: left;"><span>Таблица 1 – Результат заполнения массива при использовании некоторых компиляторов<br />
</span></p>
<div style="margin-left: 5pt;">
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 30px;" />
<col style="width: 210px;" />
<col style="width: 120px;" />
<col style="width: 108px;" />
<col style="width: 176px;" /></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 1pt;" rowspan="2" valign="middle">
<p style="text-align: center;"><span>№</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 1pt; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" rowspan="2" valign="middle">
<p style="text-align: center;"><span>Исходный фрагмент кода программы</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 1pt; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" colspan="3" valign="middle">
<p style="text-align: center;"><span>Значения элементов массива</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>wxDev C++ 7.4</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>Borland C++ 5.02</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>Microsoft Visual C++ 2005 Express</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>1</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: justify;"><span><em>int i=1, m[4];<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ m[i]=(++i)++;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> for (int j=0; j&lt;4;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;m[j++]&lt;&lt;&#8221;t&#8221;);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0;}</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 0 2</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>2</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: justify;"><span><em>int i=1, m[4];<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ m[i]=++i;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> for (int j=0; j&lt;4;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;m[j++]&lt;&lt;&#8221;t&#8221;);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0;}</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 2 0 0</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>3</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: justify;"><span><em>int m[4];<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ int i=1;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> m[i]=++i;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> for (int j=0; j&lt;4;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;m[j++]&lt;&lt;&#8221;t&#8221;);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0;}</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>4</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: justify;"><span><em>int m[4];<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ int i=1;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> m[i]=(++i)++;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> for (int j=0; j&lt;4;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;m[j++]&lt;&lt;&#8221;t&#8221;);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0;}</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 0 2</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>0 0 2 0</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: justify;"><span>Как видно, результаты вычислений зависят от используемого компилятора – один и тот же код дает различающиеся результаты для разных компиляторов. Стоит, однако, отметить компилятор Microsoft Visual C++ 2005 Express, который дал ожидаемый по написанному коду результат для всех рассмотренных случаев.<br />
</span></p>
<p style="text-align: justify;"><span>Рассмотрим теперь примеры, демонстрирующие использование функций с переменным количеством параметров. Здесь также могут возникать неоднозначности. Как известно, количество параметров можно задать двумя способами [2]: передать это количество вызываемой функции явным образом через обязательный аргумент; просто договориться о некотором специальном признаке конца списка аргументов.<br />
</span></p>
<p style="text-align: justify;"><span>В обоих случаях доступ к аргументам осуществляется с использованием указателей. Рассмотрим реализацию первого способа на примере задачи о нахождении суммы заранее неизвестного количества элементов.<br />
</span></p>
<p style="text-align: justify;"><span><em>int summa1(int n, &#8230;)<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ int s=0; int *a=&amp;n;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> while (n&#8211;) s+=*(++a);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> return s; }<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ cout&lt;&lt;&#8221;Сумма элементов 1, 5, 7, 3: &#8220;&lt;&lt;summa1(4, 1, 5, 7, 3)&lt;&lt;endl;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;&#8221;Сумма элементов 4, 11, 5, 3, 4: &#8220;&lt;&lt;summa1(5, 4, 11, 5, 3, 4);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0; }<br />
</em></span></p>
<p style="text-align: justify;"><span>Здесь используется указатель <img src="https://web.snauka.ru/wp-content/uploads/2014/04/041214_1156_1.png" alt="" /> для перебора суммируемых аргументов; его значение инициализируется адресом обязательного первого аргумента <img src="https://web.snauka.ru/wp-content/uploads/2014/04/041214_1156_2.png" alt="" /> (адресом начала списка аргументов) и затем в цикле наращивается для получения доступа к следующему аргументу.<br />
</span></p>
<p style="text-align: justify;"><span>Рассмотрим теперь реализацию второго способа на примере той же задачи.<br />
</span></p>
<p style="text-align: justify;"><span><em>double summa2(double x, &#8230;)<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ double s=0.0; double *a=&amp;x;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> while (*a) s+=*(a++);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> return s; }<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ cout&lt;&lt;&#8221;Сумма элементов 4.1,1.0,-5.1,7.3: &#8220;&lt;&lt;summa2(4.1,1.0,-5.1,7.3,0.0)&lt;&lt;endl;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;&#8221;Сумма элементов 5.2,4.3,11.1,5.1,3.1: &#8220;&lt;&lt;summa2(5.2,4.3,11.1,5.1,3.1,0.0);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0;}<br />
</em></span></p>
<p style="text-align: justify;"><span>В этом случае цикл суммирования перебирает аргументы до тех пор, пока не встретит нулевой элемент, который должен быть обязательно использован при вызове функции summa2. Разные компиляторы также дают для приведенного здесь кода (для второго способа реализации) разные результаты в зависимости от префиксной или постфиксной формы записи (таблица 2). Первый способ реализации для обсуждаемых в статье компиляторов при этом дает одинаковый результат (таблица 3).<br />
</span></p>
<p style="text-align: left;"><span>Таблица 2 – Результат работы функции с переменным количеством параметров (способ 2)<br />
</span></p>
<div style="margin-left: 5pt;">
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 264px;" />
<col style="width: 192px;" />
<col style="width: 186px;" /></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 1pt;" rowspan="2" valign="middle">
<p style="text-align: center;"><span>Используемый<br />
</span></p>
<p style="text-align: center;"><span>компилятор</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 1pt; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" colspan="2" valign="middle">
<p style="text-align: center;"><span>Результат работы<br />
</span></p>
<p style="text-align: center;"><span>в зависимости от вида кода в цикле while</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span><em>while (*a) s+=*(a++);</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span><em>while (*a) s+=*(++a);</em></span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span>Borland C++ 5.02</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>7.3 и 28.8</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>3.2 и 23.6</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span>wxDev-C++ 7.4</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>15.5 и 39.2</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>7.3 и 28.8</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span>Microsoft Visual C++ 2005 Express</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>7.3 и 28.8</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>3.2 и 23.6</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: left;"><span>Таблица 3 – Результат работы функции с переменным количеством параметров (способ 1)<br />
</span></p>
<div style="margin-left: 5pt;">
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 264px;" />
<col style="width: 192px;" />
<col style="width: 186px;" /></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 1pt;" rowspan="2" valign="middle">
<p style="text-align: center;"><span>Используемый<br />
</span></p>
<p style="text-align: center;"><span>компилятор</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 1pt; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" colspan="2" valign="middle">
<p style="text-align: center;"><span>Результат работы<br />
</span></p>
<p style="text-align: center;"><span>в зависимости от вида кода в цикле while</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span><em>while (*a) s+=*(a++);</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span><em>while (*a) s+=*(++a);</em></span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span>Borland C++ 5.02</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>16 и 27</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>16 и 27</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span>wxDev-C++ 7.4</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>16 и 27</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>16 и 27</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span>Microsoft Visual C++ 2005 Express</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>16 и 27</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;" valign="middle">
<p style="text-align: center;"><span>16 и 27</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: justify;"><span>Результат работы компилятора wxDev-C++ 7.4, на первый взгляд, не совсем ясен. Также отмечу, что если при описании приведенной здесь функции summa2 тип double везде поменять на тип float, то программа будет работать некорректно (при использовании все того же компилятора wxDev-C++ 7.4).<br />
</span></p>
<p style="text-align: justify;"><span>Функцию summa1, реализующую первый способ передачи количества параметров, можно несколько видоизменить, чтобы она позволяла работать с аргументами типа double – измененный текст программы приведен ниже.<br />
</span></p>
<p style="text-align: justify;"><span><em>double summa1(int n, double k, &#8230;)<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ double s=0. ;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> double *a=&amp;k;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> while (n&#8211;) s+=*(a++);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> return s; }<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ cout&lt;&lt;&#8221;Сумма эл-в 1.15, 10.5, 2.7, 5.3: &#8220;&lt;&lt;summa1(4, 1.15, 10.5, 2.7, 5.3)&lt;&lt;endl;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;&#8221;Сумма эл-в 4, 1.11, 5.1, 2.23, 4.7: &#8220;&lt;&lt;summa1(5, 4., 1.11, 5.1, 2.23, 4.7);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0; }<br />
</em></span></p>
<p style="text-align: justify;"><span>Представленный здесь код при использовании компилятора wxDev-C++ 7.4 снова дает неправильный результат. Очевидно, это связано с преобразованием типов и моделью памяти, принимаемым в данном компиляторе. Вот код того же примера, который будет нормально работать с компилятором wxDev-C++ 7.4.<br />
</span></p>
<p style="text-align: justify;"><span><em>long double summa1(int n, long double k, &#8230;)<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ long double s=0. ;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> long double *a=&amp;k;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> while (n&#8211;) s+=*a++;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> return s; }<br />
</em></span></p>
<p style="text-align: justify;"><span><em>int main()<br />
</em></span></p>
<p style="text-align: justify;"><span><em>{ cout&lt;&lt;&#8221;Сумма эл-в 1.15,10.5,2.7,5.3: &#8220;&lt;&lt;summa1(4,1.15L,10.5L,2.7L,5.3L)&lt;&lt;endl;<br />
</em></span></p>
<p style="text-align: justify;"><span><em> cout&lt;&lt;&#8221;Сумма эл-в 4,1.11,5.1,2.23, 4.7: &#8220;&lt;&lt;summa1(5,4.L,1.11L,5.1L,2.23L,4.7L);<br />
</em></span></p>
<p style="text-align: justify;"><span><em> getch(); return 0; }<br />
</em></span></p>
<p style="text-align: justify;"><span>Этот код также будет нормально работать и с компилятором Microsoft Visual C++ 2005 Express, однако с компилятором Borland C++ 5.02 будет приводить к ошибке.<br />
</span></p>
<p style="text-align: justify;"><span>Перейдем теперь к неоднозначностям, имеющим место при работе с потоками ввода-вывода. При вводе данных операция &gt;&gt; читает всё, начиная с первого символа (не являющегося символом-разделителем) до следующего символа, который не соответствует типу объекта назначения. Поэтому наиболее распространенной ошибкой при использовании потоков <em>istream</em> является ошибка, связанная с вводом данных, не соответствующих указанному формату. В таких случаях нужно или проверять состояние потока ввода перед использованием считанных данных, или использовать механизм исключений [3, 4]. Рассмотрим, например, следующий фрагмент кода:<br />
</span></p>
<p style="text-align: justify;"><span><em>float a, b;<br />
</em></span></p>
<p style="text-align: justify;"><span><em>cin&gt;&gt;a&gt;&gt;b;<br />
</em></span></p>
<p style="text-align: justify;"><span><em>cout&lt;&lt;a&lt;&lt;&#8221; &#8220;&lt;&lt;b;<br />
</em></span></p>
<p style="text-align: justify;"><span>Если при вводе данных указать, например, 1.234w, то значение переменной <em>a</em> будет равно 1.234, но значение переменной <em>b</em> будет неопределенно, т.к. сразу после ввода 1.234w программа перейдет к строке с инструкцией <em>cout</em>. Дело в том, что как только в потоке встретится символ <em>w</em>, являющийся некорректным с точки зрения ожидаемого формата вводимых данных, последним принятым символом будет 4. Символ <em>w</em> останется во входном потоке, и следующая операция &gt;&gt; начнет чтение с этой точки, что и приводит к неопределенности. Поэтому следующий фрагмент кода<br />
</span></p>
<p style="text-align: justify;"><span><em>float a;<br />
</em></span></p>
<p style="text-align: justify;"><span><em>char b;<br />
</em></span></p>
<p style="text-align: justify;"><span><em>cin&gt;&gt;a&gt;&gt;b;<br />
</em></span></p>
<p style="text-align: justify;"><span><em>cout&lt;&lt;a&lt;&lt;&#8221; &#8220;&lt;&lt;b;<br />
</em></span></p>
<p style="text-align: justify;"><span>будет работать верно при вводе строки 1.234w.<br />
</span></p>
<p style="text-align: justify;"><span>Может случиться так, что самое первое введенное значение будет ошибочным с точки зрения формата. В этом случае операция &gt;&gt; оставит значение переменной без изменений и вернет значение 0 (<em>false</em>), что позволит проверить, отвечал ли ввод требованиям установленного формата данных для переменной. Ниже представлен фрагмент программы, в котором вводятся числа и ведется подсчет их суммы до тех пор, пока вводятся корректные значения для переменной.<br />
</span></p>
<p style="text-align: justify; margin-left: 117pt;"><span><em>float a, s=0.;<br />
</em></span></p>
<p style="text-align: justify; margin-left: 117pt;"><span><em>while(cin&gt;&gt;a) s+=a;<br />
</em></span></p>
<p style="text-align: justify; margin-left: 117pt;"><span><em>cout&lt;&lt;&#8221;nЗначение переменной а: &#8220;&lt;&lt;a;<br />
</em></span></p>
<p style="text-align: justify; margin-left: 117pt;"><span><em>cout&lt;&lt;&#8221;nСумма чисел: &#8220;&lt;&lt;s&lt;&lt;endl;<br />
</em></span></p>
<p style="text-align: justify;"><span>Пусть в процессе ввода часть чисел вводятся через нажатие клавиши &#8220;Enter&#8221;, причем это будут корректные данные; затем, в следующей строке, вводится последовательность чисел через символ-разделитель (пробел):<br />
</span></p>
<p style="text-align: justify;"><span><em>1.37<br />
</em></span></p>
<p style="text-align: justify;"><span><em>2.45<br />
</em></span></p>
<p style="text-align: justify;"><span><em>1.23 4 13.4 2.2b 3.4 5.6<br />
</em></span></p>
<p style="text-align: justify;"><span>Результатом работы фрагмента программы будет:<br />
</span></p>
<p style="text-align: justify; margin-left: 108pt;"><span><em>Значение переменной a: 2.2<br />
</em></span></p>
<p style="text-align: justify; margin-left: 108pt;"><span><em>Сумма чисел: 24.65<br />
</em></span></p>
<p style="text-align: justify;"><span>Ввод <em>cin</em> буферизуется, поэтому третья строка значений, введенных с клавиатуры, не будет пересылаться программе до тех пор, пока не будет нажата клавиша &#8220;Enter&#8221; для каждой из выше расположенных строк. Цикл прекратит работу, как только встретится символ &#8220;<em>b</em>&#8221; (третья строка), так как он не соответствует формату вещественного числа: несоответствие символа &#8220;<em>b</em>&#8221; ожидаемому формату приводит к тому, что выражение<br />
</span></p>
<p style="text-align: left;"><span><em>cin&gt;&gt;a;<br />
</em></span></p>
<p style="text-align: justify;"><span>будет оценено как <em>false</em>.<br />
</span></p>
<p style="text-align: justify;"><span>Компилятор Borland C++ 5.02 и Microsoft Visual C++ 2005 Express, как и ожидалось, дали в примере выше для переменной <em>a</em> один и тот же результат: 2.2. Однако компилятор wxDev-C++ 7.4 сбрасывает значение переменной <em>a</em> в ноль. Последнее противоречит принципу, принятому в С++: если попытаться прочитать в некоторую переменную и операция не выполняется, значение переменной должно остаться неизменным.<br />
</span></p>
<p style="text-align: justify;"><span>Приведенные примеры показывают, что стабильных правильных результатов среди рассмотренных компиляторов можно добиться только при использовании компилятора Microsoft Visual C++ 2005 Express и выше. Результаты, которые получаются с использованием компиляторов Borland C++ 5.02 и wxDev C++7.4, сильно зависят от содержания исходного кода программы.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2014/04/33610/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Свобода от всего – наказание» (по рассказу М. Горького «Старуха Изергиль»)</title>
		<link>https://web.snauka.ru/issues/2018/05/86637</link>
		<comments>https://web.snauka.ru/issues/2018/05/86637#comments</comments>
		<pubDate>Wed, 30 May 2018 11:02:48 +0000</pubDate>
		<dc:creator>Сочнева Анастасия Сергеевна</dc:creator>
				<category><![CDATA[24.00.00 КУЛЬТУРОЛОГИЯ]]></category>
		<category><![CDATA[герой]]></category>
		<category><![CDATA[легенда.]]></category>
		<category><![CDATA[многогранность]]></category>
		<category><![CDATA[независимость]]></category>
		<category><![CDATA[неоднозначность]]></category>
		<category><![CDATA[проблема]]></category>
		<category><![CDATA[рассказ]]></category>
		<category><![CDATA[свобода]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2018/05/86637</guid>
		<description><![CDATA[Человек во все времена стремился к свободе. Сложно существовать, находясь в каких-то рамках. Для многих быть свободным – значит жить полной жизнью, не зависеть от людей, от их мнения. Отсюда образ счастливого и светлого будущего. Каждый из нас мечтает о независимости действий, слова, мысли. Но не всяка свобода бывает подарком судьбы. Для некоторых она становится [...]]]></description>
			<content:encoded><![CDATA[<p>Человек во все времена стремился к свободе. Сложно существовать, находясь в каких-то рамках. Для многих быть свободным – значит жить полной жизнью, не зависеть от людей, от их мнения. Отсюда образ счастливого и светлого будущего. Каждый из нас мечтает о независимости действий, слова, мысли. Но не всяка свобода бывает подарком судьбы. Для некоторых она становится крестом, который приходится нести на себе всю жизнь.</p>
<p>Так, в произведении Максима Горького «Старуха Изергиль» поднимается эта актуальная и по сей день проблема – проблема свободы. Ларра – сын простой женщины и орла. Попав в общество людей, герой выставляла напоказ свою гордыню, доставшуюся от отца. Ларра ставил себя выше всех, презирал людей и жестоко обращался с ними. Он жаждал свободы, жил по своим правилам, не задумываясь, что вседозволенность может привести к ужасным последствиям. Герой убил девушку, оттолкнувшую его. Племя пыталось придумать казнь, достойную его преступления. Как бы это парадоксально не звучало, но люди наказали Ларру свободой, тем, к чему так усердно стремятся многие из нас. Юноша был обречен на одиночество до конца своих дней. Он стал вольный, как птица. Но такая свобода – мучение. Устав от жизни, Ларра предпочёл быть убитым людьми, но земля не приняла его. Герою не улыбалась ни жизнь, ни смерть. Свобода превратила его в едва заметную тень. Вот что сотворила с человеком высокомериеcх [1].</p>
<p>Образ Данко – полная антитеза образу Ларры. Как рассказывает легенда, люди были обречены на страшную смерть в дремучем лесу. В образе Данко Горький воплощает свой идеал сильной личности, готовой пожертвовать собой во имя высокой цели. Устав идти, люди стали судить Данко, сулили ему смерть и даже были готовы сдаться врагу. Но герой был свободен от мнения народа. Он вырвал своё сердце, чтобы осветить путь. Воля Данко противопоставляется безволию толпы. Жертвенность спасла людей, но убила его самого. Горький уверен, что свобода человека – это способность отдать свою жизнь ради благого дела.</p>
<p>Старуха Изергиль поведала слушателю и о своей жизни. Особое место в рассказе занимает история её судьбы – олицетворение нравственных ценностей, красоты и свободы. В жизни Изергиль было много мужчин, и ради них она была готова на самопожертвование. Это сближает её с Данко. Но Бог наказал женщину, сделав её, как Ларру, одинокой до самой смерти. Она также оставалась свободной, но была никому не нужна. Её черные глаза были пусты и серы, совсем как то, что осталось от Ларры [2].</p>
<p>Я глубоко убеждена, что человек сам творец своей судьбы. Свобода – это довольно противоречивое и многогранное понятие. Тем, кто достойно живёт, она будет ниспослана с небес, словно подарок от Бога. А тот, кто проявляет высокомерие и чувствует вседозволенность, будет наказан свободой.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2018/05/86637/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
