<?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?]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=12681</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=12681&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «как (не)написать первый быдлокод на C?».]]></description>
		<lastBuildDate>Tue, 12 Apr 2011 05:16:59 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167604#p167604</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>0,1, и 3.</p></blockquote></div><p>s/0,1, и 3/0,1, и 2/<br />fixed</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Tue, 12 Apr 2011 05:16:59 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167604#p167604</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167603#p167603</link>
			<description><![CDATA[<div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>вот холивар на пустом месте развели.... си всегда славился множеством UB и спорить по ним бесполезно... всегда можно создать компилятор, который будет возвращать 192 в данном случае.</p></blockquote></div><p>не. в данном случае стандарт хоть и не определяет точно решение, но какие-то рамки есть.<br />1) тут три операции, потому мы имеем не более 6и перестановок.<br />2) 3 из 6 перестановок нам не подходят, ибо по стандарту -- старше - и должно вычисляться раньше.<br />ну и получаем мы всего 3 ответа 0,1, и 3.<br /></p><div class="quotebox"><cite>Fat-Zer пишет:</cite><blockquote><p>если нечем заняться, то давайте ещё будем думать, чему равно x=333; (x++ - --x) * ((&amp;((char) x))[1]) &lt;&lt; (x-=7);</p></blockquote></div><p>уволить быдлокодера и переписать строку по человечески? не?<br />просто вы видите, что это быдлокод, и я вижу. А сам быдлокодер - не видит. Вот для него эта тема и создавалась - что-бы видел, какая НЁХ получается.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Tue, 12 Apr 2011 05:13:07 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167603#p167603</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167595#p167595</link>
			<description><![CDATA[<p>вот холивар на пустом месте развели.... си всегда славился множеством UB и спорить по ним бесполезно... всегда можно создать компилятор, который будет возвращать 192 в данном случае. и это будет соответствовать стандарту. если нечем заняться, то давайте ещё будем думать, чему равно x=333; (x++ - --x) * ((&amp;((char) x))[1]) &lt;&lt; (x-=7);</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Tue, 12 Apr 2011 04:24:57 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167595#p167595</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167459#p167459</link>
			<description><![CDATA[<div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>Т.е., ведет себя так, будто х - это две разных переменных.</p></blockquote></div><p>угу. на самом деле, такое поведение давно, со времён iP1 - когда в нём две трубы появилось - вот компилятор и старается раздвоить поток. Конечно он не рассчитан на мой быдлокод, но в других случаях команды спариваются, и выполняются одновременно.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 17:38:29 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167459#p167459</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167458#p167458</link>
			<description><![CDATA[<p><strong>Newton</strong>, а какое там поведение? пробовать лень <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /></p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 17:36:18 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167458#p167458</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167403#p167403</link>
			<description><![CDATA[<p>Т.е., ведет себя так, будто х - это две разных переменных. <br />Так выходит для следующего кода:<br /></p><div class="codebox"><pre><code>    int x;
    printf(&quot;Введите число: &quot;);
    scanf(&quot;%d&quot;, &amp;x);

    printf(&quot;\nx-- - --x = %d\n&quot;, x-- - --x);
    return 0;</code></pre></div><p>&nbsp; Поведение меняется из-за появления ссылки на х. (Других причин не вижу)</p><p>&nbsp; Такой же коде:<br /></p><div class="codebox"><pre><code>    int i;
    printf(&quot;Введите число: &quot;);
    scanf(&quot;%d&quot;, &amp;i);

    int x = i;
    printf(&quot;\nx-- - --x = %d\n&quot;, x-- - --x);
    return 0;</code></pre></div><p>&nbsp; Ведет себя так, как я показал выше. И это справедливо только для gcc, MSVC как раз возвращает ноль при любом варианте.</p>]]></description>
			<author><![CDATA[null@example.com (Newton)]]></author>
			<pubDate>Mon, 11 Apr 2011 16:05:52 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167403#p167403</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167380#p167380</link>
			<description><![CDATA[<div class="quotebox"><cite>Newton пишет:</cite><blockquote><p> Тут и начинается неоднозначность - компилер пытается разделить её на две, при этом не забывая, что переменная все-таки одна.</p></blockquote></div><p>он не только пытается, но и так делает. походу дела синхронизируя свои временные копии. в данном случае компилятор дважды выполняет декремент от 10, и дважды запоминает эту девятку...</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 15:27:25 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167380#p167380</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167375#p167375</link>
			<description><![CDATA[<div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>префикс-декремент , вычитание и возврат результата (0), пост-декремент.</p></blockquote></div><p>ну выходит так <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /></p><p>префикс-декремент, минус, возврат...<br />вот только постфикс-декремент выполняется от того, что было в x перед префикс-декрементом, и пишется в эту самую x, куда только что записался результат префиксного декремента.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 15:21:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167375#p167375</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167373#p167373</link>
			<description><![CDATA[<div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>( Если я неправ - доказательства в студию!)</p></blockquote></div><div class="codebox"><pre><code>|0000040b 8b45f4                         mov         eax, [ebp-0000000c]   // X1 &lt;= x  | 10                                         
│0000040e 8b55f4                         mov         edx, [ebp-0000000c]  //  X2 &lt;= x | 10
│00000411 4a                             dec         edx  // X2 = X2 - 1 | 9
│00000412 8955f4                         mov         [ebp-0000000c], edx  //  x &lt;= X2 | 9
│00000415 8b55f4                         mov         edx, [ebp-0000000c]  //  X2 &lt;= x (sic!)
│00000418 89c1                           mov         ecx, eax  // X3 &lt;= X1 | 10
│0000041a 29d1                           sub         ecx, edx  //  X3 &lt;= X3 - X2 | 10-9==1
│0000041c 89ca                           mov         edx, ecx  //  X2 &lt;= X3 | 1
│0000041e 48                             dec         eax // X1 &lt;= X1 - 1 | 9                                                                    
│0000041f 8945f4                         mov         [ebp-0000000c], eax  // x &lt;= X1 | 9</code></pre></div><p>кстати, если я не ошибаюсь, MSVC делал также.<br /></p><div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>Что же касается использования в рабочем коде.. какой же ССЗБ будет такое использовать?</p></blockquote></div><p>такое не будет. но IRL всё намного запутаннее.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 15:16:10 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167373#p167373</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167369#p167369</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Мой пример как раз и ценен тем, что у меня x раздваивается</p></blockquote></div><p>&nbsp; Это то, что я и пытался сказать, только другими словами. Когда я говорил про одну переменную, это означало - одну, явно объявленную программистом переменную.<br />&nbsp; <br />&nbsp; Тут и начинается неоднозначность - компилер пытается разделить её на две, при этом не забывая, что переменная все-таки одна.<br />&nbsp; <br />&nbsp; Если брать реальный компилятор (а не то что написано в стандарте), то его поведение вполне понятно - он вычитает переменную саму из себя. <br />( Если я неправ - доказательства в студию!)<br />&nbsp; <br />&nbsp; int x = 3;<br />&nbsp; int y = x-- - --x; <br />&nbsp; <br />&nbsp; y = 0 = 2-- - 2;<br />&nbsp; x = 1;<br />&nbsp; <br />&nbsp; Т.е., префикс-декремент , вычитание и возврат результата (0), пост-декремент. Тоже, само с вариантом:<br />&nbsp; <br />&nbsp; int x = 3;<br />&nbsp; int y = x++ + ++x;<br />&nbsp; <br />&nbsp; Порядок такой: преф-инкремент, сложение и возврат результата (8), пост-инкремент.<br />&nbsp; <br />&nbsp; y = 8 = 4++ + 4;<br />&nbsp; x = 5;</p><p>------------------------------------------------------------------------------<br />&nbsp; Что же касается использования в рабочем коде.. какой же ССЗБ будет такое использовать? А если уж так хочется, то можно сделать что-нибудь вроде:<br />x = function() * (y+1);</p>]]></description>
			<author><![CDATA[null@example.com (Newton)]]></author>
			<pubDate>Mon, 11 Apr 2011 15:00:08 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167369#p167369</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167281#p167281</link>
			<description><![CDATA[<div class="quotebox"><cite>zhevak пишет:</cite><blockquote><p>обратите внимание, я сказал -- в C/C++ (1) и С# (2)</p></blockquote></div><p>а... извините. что такое C# - без понятия. <br /></p><div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>Что изменится? Результат все равно один.</p></blockquote></div><p>дык ессно. откуда там неоднозначность? <strong>первый декримент вообще не имеет отношения к вычитанию</strong>, и его можно вычислять когда угодно, в т.ч. и не вычислять вовсе (в вашем примере).<br /></p><div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>Когда переменных две, нет никакой неоднозначности.</p></blockquote></div><p>нет и раздвоения - ибо в вашем выражении участвет только одно Y. </p><p>Мой пример как раз и ценен тем, что у меня x раздваивается, причём операция --x читает одну переменную х1, а пишет вторую - х2. Потому и получается столь неожиданный результат. ибо x--, --x вычтет из x двойку, а не единицу. А x-- - --x вычитает таки единицу.</p><div class="quotebox"><cite>Newton пишет:</cite><blockquote><p>В данном случае, не важно когда они вычисляются.</p></blockquote></div><p>угу. 2*2 всегда равно 4. Ну и что тут интересного и полезного?</p><p>В моём случае - важно. Ибо, если у вас есть функция, которая работает 1 час, то её выпадение вы заметите (программа будет работать на 1 час быстрее), и выпадение будет, когда оптимизирующий компилятор умножит эту функцию на x-- - --x, или любое другое выражение, которое тождественно равно нулю (если конечно у компилятора хватит ума распарсить, что x-- - --x может быть равно нулю). Заметьте, тут нет условий, просто умножение<br /></p><div class="codebox"><pre><code>x = function() * y;</code></pre></div><p>компилируется в <br /></p><div class="codebox"><pre><code>x = 0;</code></pre></div><p>если на этапе компиляции компилятор выяснил, что y может быть константой равной нулю.</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 12:29:57 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167281#p167281</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167250#p167250</link>
			<description><![CDATA[<p>Это переменные, весь вопрос в инициализации. Ну заменим на:<br /></p><div class="codebox"><pre><code>  int x, y;

  printf(&quot;give me a number x: &quot;);
  scanf(&quot;%d&quot;, &amp;x);

  printf(&quot;give me a number y: &quot;);
  scanf(&quot;%d&quot;, &amp;y);

  printf(&quot;x-- - --y = %d\n&quot;, x-- - --y);</code></pre></div><p> Что изменится? Результат все равно один. <br />&nbsp; <br /></p><div class="quotebox"><blockquote><p>ну а откуда тут неоднозначность-то?</p></blockquote></div><p>&nbsp; Когда переменных две, нет никакой неоднозначности. </p><div class="quotebox"><blockquote><p>константы не вычисляются в runtime!</p></blockquote></div><p>&nbsp; В данном случае, не важно когда они вычисляются.</p>]]></description>
			<author><![CDATA[null@example.com (Newton)]]></author>
			<pubDate>Mon, 11 Apr 2011 11:36:51 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167250#p167250</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167238#p167238</link>
			<description><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p><strong>zhevak</strong>, да что вы говорите?!</p><p><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">ksu@ksu:~/test$ cat zh.c<br />...<br />x++ + ++x =8<br /></div></p><p>всё одно и то-же у меня получается. Да и ваша задачка куда как проще моей - в ней результат не зависит от порядка слагаемых, а значит тонкие моменты ускользают. (например то, когда и как выполняются инкременты)</p></blockquote></div><p>Дмитрий, обратите внимание, я сказал -- в C/C++ (1) и С# (2)</p><p>А остальное, извините, комментировать не буду. (Помолчу-ка я лучше в тряпочку какое-то время ...)</p>]]></description>
			<author><![CDATA[null@example.com (zhevak)]]></author>
			<pubDate>Mon, 11 Apr 2011 11:19:29 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167238#p167238</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167237#p167237</link>
			<description><![CDATA[<div class="quotebox"><cite>zhevak пишет:</cite><blockquote><p>Я эту тему поднимал лет пять назад не то на rsdn.ru</p></blockquote></div><p>эта тема неоднократно поднималась в FIDO задолго до этого&nbsp; <img src="https://linuxforum.ru/img/smilies/ag.gif" alt="ag" /> <br /></p><div class="quotebox"><cite>zhevak пишет:</cite><blockquote><p>сошлись на том, что в описании языка ведь не даром говориться о том, чтобы не использовать такие приемы. Стандарт языка не гарантирует их одинакового поведения на разных платформах/компиляторах. Какой смысл изучать то, что языком не регламентируется?</p></blockquote></div><p>неверный вывод: я такое постоянно в чужом коде вижу (честно говоря, иногда и в своём), просто это более тщательно замаскированно...<br /></p><div class="quotebox"><cite>zhevak пишет:</cite><blockquote><p>одно и то же выражение в разных языках C/C++ и C# дает разный результат:</p></blockquote></div><p>да. результат отличается, но анализ кода говорит, что разница не принципиальная - просто компилятор имеет право, и оптимизирует тривиальные операции когда аргументы целые, но не в состоянии оптимизировать, если аргументы не являются тривиальным типом (я проверил - даже если это inline подстановка даже тех же целых, этой оптимизации нет)</p><p>ЗЫЖ <strong>повторяю - константы не вычисляются в runtime!</strong></p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 11:18:34 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167237#p167237</guid>
		</item>
		<item>
			<title><![CDATA[Re: как (не)написать первый быдлокод на C?]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=167232#p167232</link>
			<description><![CDATA[<p><strong>zhevak</strong>, да что вы говорите?!</p><p><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">ksu@ksu:~/test$ cat zh.c<br />#include &lt;stdio.h&gt;</p><p>int main()<br />{<br />&nbsp; &nbsp; int x = 3;<br />&nbsp; &nbsp; int res = x++ + ++x;<br />&nbsp; &nbsp; printf(&quot;x++ + ++x =%d\n&quot;, res);<br />&nbsp; &nbsp; return 0;<br />}<br />ksu@ksu:~/test$ gcc -Wall -o zh zh.c <br />zh.c: В функции ‘main’:<br />zh.c:6:18: предупреждение: операция над ‘x’ может дать неопределенный результат<br />ksu@ksu:~/test$ ./zh<br />x++ + ++x =8<br />ksu@ksu:~/test$ cat zh.cpp <br />#include &lt;stdio.h&gt;</p><p>int main()<br />{<br />&nbsp; &nbsp; int x = 3;<br />&nbsp; &nbsp; int res = x++ + ++x;<br />&nbsp; &nbsp; printf(&quot;x++ + ++x =%d\n&quot;, res);<br />&nbsp; &nbsp; return 0;<br />}<br />ksu@ksu:~/test$ g++ -Wall -o zh zh.cpp <br />zh.cpp: В функции ‘int main()’:<br />zh.cpp:6:20: предупреждение: операция над ‘x’ может дать неопределенный результат<br />ksu@ksu:~/test$ ./zh<br />x++ + ++x =8<br /></div></p><p>всё одно и то-же у меня получается. Да и ваша задачка куда как проще моей - в ней результат не зависит от порядка слагаемых, а значит тонкие моменты ускользают. (например то, когда и как выполняются инкременты)</p>]]></description>
			<author><![CDATA[null@example.com (drBatty)]]></author>
			<pubDate>Mon, 11 Apr 2011 11:08:18 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=167232#p167232</guid>
		</item>
	</channel>
</rss>
