{"id":16215,"date":"2022-10-05T07:00:00","date_gmt":"2022-10-05T05:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=16215"},"modified":"2023-02-16T15:03:15","modified_gmt":"2023-02-16T14:03:15","slug":"przecinek-w-jezyku-c-do-czego-sluzy","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/przecinek-w-jezyku-c-do-czego-sluzy\/","title":{"rendered":"Przecinek w j\u0119zyku C \u2013 do czego s\u0142u\u017cy?"},"content":{"rendered":"\n<p>Zanim przejdziemy do omawiania tematu, czyli przecinka w j\u0119zyku C, mam dla Ciebie kr\u00f3ciutki programik do analizy. Spr\u00f3buj wydedukowa\u0107, jaki b\u0119dzie wynik jego dzia\u0142ania:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;stdio.h&gt;\n#define PI (3,1415)\nint main()\n{\n    \/\/ Calculates the area of circle\n  \n    float area, radius;\n          \n    radius = 1;    \n        area = PI * radius * radius;  \n            \n        printf(&quot;area = %f&quot;, area);   \n        return 0;\n    }\n<\/pre><\/div>\n\n\n<p>Poprawna odpowied\u017a to:<\/p>\n\n\n\n<p>a) program nie skompiluje si\u0119,<\/p>\n\n\n\n<p>b) program wypisze \u201earea = 3.141500\u201d,<\/p>\n\n\n\n<p>c) program wypisze \u201earea = 1415.000000\u201d,<\/p>\n\n\n\n<p>d) program wypisze \u201earea = 3.000000\u201d.<\/p>\n\n\n\n<p>Oczywi\u015bcie, co do potwierdzenia dzia\u0142ania, najpro\u015bciej skopiowa\u0107 podany program i go skompilowa\u0107. Zaskoczeni wynikiem?<\/p>\n\n\n\n<p>Przyczyn\u0119, dlaczego program dzia\u0142a tak, a nie inaczej, <strong>om\u00f3wimy sobie na ko\u0144cu artyku\u0142u<\/strong>. A teraz zapraszam do lektury.<\/p>\n\n\n\n<p>Prawdopodobnie wiele os\u00f3b w tym momencie pomy\u015bli, \u017ce temat dzia\u0142ania przecinka (,) w j\u0119zyku C jest tak trywialny i prosty, \u017ce nie za bardzo jest, co omawia\u0107, a ju\u017c na pewno nie jest to temat na artyku\u0142. C\u00f3\u017c, postaram si\u0119 pokaza\u0107, i\u017c jest z go\u0142a inaczej i przecinek potrafi by\u0107 skompilowany w nieoczekiwany dla nas spos\u00f3b, przysparzaj\u0105c nam b\u00f3lu g\u0142owy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Rola przecinka w j\u0119zyku C<\/strong><\/h2>\n\n\n\n<p>Przecinek w j\u0119zyku C mo\u017ce wyst\u0105pi\u0107 w dw\u00f3ch kontekstach: <strong>jako separator oraz jako operator<\/strong>. Zdecydowana wi\u0119kszo\u015b\u0107 programist\u00f3w zna i u\u017cywa przecinka jedynie jako separatora. Niewielki odsetek os\u00f3b wie, \u017ce mo\u017ce on tak\u017ce wyst\u0105pi\u0107 jako operator. Ju\u017c sam brak wiedzy o tym, zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w czy pomy\u0142ek. Om\u00f3wmy te dwa przypadki bardziej szczeg\u00f3\u0142owo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przecinek jako separator<\/strong><\/h2>\n\n\n\n<p>Rola przecinka jako separatora jest podstawow\u0105 funkcj\u0105 w j\u0119zyku C i jest powszechnie znana oraz wykorzystywana. Zasady jego u\u017cycia poznajemy ju\u017c na samym pocz\u0105tku nauki programowania w j\u0119zyku C. Jak wskazuje nazwa, jego zadaniem jest odseparowanie:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>identyfikator\u00f3w,<\/li><li>parametr\u00f3w funkcji,<\/li><li>makr,<\/li><li>nazw zmiennych w deklaracjach itp.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przyk\u0142ady u\u017cycia przecinka jako separatora<\/strong><\/h3>\n\n\n\n<p>Sp\u00f3jrzmy na przyk\u0142ady, zwracaj\u0105c uwag\u0119 na umieszczone w kodzie przecinki:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\t\/\/Definicja makra z dwoma argumentami\n\t#define min(X, Y)  ((X) &lt; (Y) ? (X) : (Y))    \n\t \n\t\/\/Deklaracja dw\u00f3ch zmiennych typu int i ich inicjalizacja\n\tint a = 1, b = 2;                             \n\t \n\t\/\/Deklaracja funkcji o dw\u00f3ch parametrach typu int\n\tvoid func(int x, int y);                      \n\t \n\t\/\/Deklaracja enumeratora\n\tenum week{Mon, Tue, Wed, Thu, Fri, Sat, Sun}; \n\t \n\t\/\/Deklaracja i inicjalizacja tablicy int-\u00f3w\n\tint arr&#x5B;5] = { 1, 2, 3, 4, 5 };            \n\t    \n\t\/\/Wywo\u0142anie funkcji z dwoma parametrami\n\tfunc(1, 2);    \n\n<\/pre><\/div>\n\n\n<p>U\u017cycie przecinka w tym kontek\u015bcie jest do\u015b\u0107 intuicyjne. S\u0105 jednak przypadki, gdzie mo\u017cemy pope\u0142ni\u0107 b\u0142\u0105d. Spr\u00f3bujmy zadeklarowa\u0107 dwa wska\u017aniki p1 oraz p2:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint* p1, p2;\n<\/pre><\/div>\n\n\n<p>Wbrew temu, co mo\u017ce si\u0119 wydawa\u0107 na pierwszy rzut oka, \u201ep2\u201d nie b\u0119dzie wska\u017anikiem na int, a po prostu zmienn\u0105 typu int. Jedynie \u201ep1\u201d b\u0119dzie wska\u017anikiem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sposoby zadeklarowania dw\u00f3ch wska\u017anik\u00f3w<\/strong><\/h3>\n\n\n\n<p>Aby prawid\u0142owo zadeklarowa\u0107 dwa wska\u017aniki, powinni\u015bmy to zrobi\u0107 na jeden z nast\u0119puj\u0105cych sposob\u00f3w:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint* p1;\n\tint* p2;\n\t \n\tint *p3, *p4;\n\t \n\ttypedef char * char_ptr_t;\n\tchar_ptr_t p5, p6;\n\n<\/pre><\/div>\n\n\n<p>Linie 1 i 2 zawieraj\u0105 oczywiste i czytelne rozwi\u0105zanie problemu, jednak przy du\u017cej ilo\u015bci wska\u017anik\u00f3w do deklaracji, b\u0119dzie zajmowa\u0107 wiele linii, wyd\u0142u\u017caj\u0105c kod.<\/p>\n\n\n\n<p>W linii 4 mamy bardziej skondensowane rozwi\u0105zanie. W linii 6 i 7 deklarujemy w\u0142asny typ wska\u017anikowy, deklaruj\u0105c p5 i p6 jako takie w\u0142a\u015bnie wska\u017aniki. W tym rozwi\u0105zaniu pozbywamy si\u0119 problemu gdzie i ile postawi\u0107 gwiazdek, ale patrz\u0105c tylko na lini\u0119 7, <strong>nie jest oczywiste, i\u017c mamy tutaj do czynienia ze wska\u017anikami<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przecinek jako operator<\/strong><\/h2>\n\n\n\n<p>Jak ju\u017c zosta\u0142o to wspomniane, przecinek mo\u017ce tak\u017ce wyst\u0119powa\u0107 jako operator. Jest to mniej znana posta\u0107, kt\u00f3r\u0105 do\u015b\u0107 rzadko mo\u017cemy spotka\u0107 w kodzie \u017ar\u00f3d\u0142owym, ale kt\u00f3r\u0105 warto opisa\u0107.<\/p>\n\n\n\n<p>Sk\u0142adnia:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\texpression1 , expression2\n<\/pre><\/div>\n\n\n<p>Operator przecinka: wylicza pierwszy operand (expression1) i odrzuca jego wynik, nast\u0119pnie wylicza drugi operand (expression2) i zwraca jego warto\u015b\u0107.<\/p>\n\n\n\n<p>Operator przecinka oddziela operacje, analogicznie do \u015brednika, kt\u00f3ry jest terminatorem instrukcji:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\ta, b;   \/\/sekwencja wyra\u017ce\u0144, podobna do: \n\tA; B;   \/\/sekwencja instrukcji\n<\/pre><\/div>\n\n\n<p>Bardzo wa\u017cna jest tak\u017ce informacja, i\u017c <strong>operator przecinka ma najni\u017cszy priorytet<\/strong> spo\u015br\u00f3d wszystkich operator\u00f3w C i dzia\u0142a jako punkt sekwencyjny.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-6.png\"><img decoding=\"async\" width=\"798\" height=\"881\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-6.png\" alt=\"Rodzaje operator\u00f3w w j\u0119zyku C i ich funkcje\" class=\"wp-image-16217\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-6.png 798w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-6-272x300.png 272w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-6-768x848.png 768w\" sizes=\"(max-width: 798px) 100vw, 798px\" \/><\/a><figcaption>Ryc. 1 Rodzaje operator\u00f3w w j\u0119zyku C i ich funkcje<\/figcaption><\/figure><\/div>\n\n\n\n<p>Aby lepiej zrozumie\u0107 dzia\u0142anie operatora przecinkowego, sp\u00f3jrzmy na kilka przyk\u0142ad\u00f3w i dokonajmy ich analizy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Deklaracja zmiennej<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint x = 1, 2;  \n<\/pre><\/div>\n\n\n<p>B\u0142\u0105d kompilacji (error: expected identifier). Sp\u00f3jrzmy, jak zinterpretuje to kompilator. U\u017cyjemy nawias\u00f3w, aby u\u0142atwi\u0107 sobie wizualizacj\u0119, co b\u0119dzie wykonane najpierw:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint (x = 1), 2; \/\/najpierw zostanie zadeklarowana zmienna x i zainicjonowana warto\u015bci\u0105 \u201e1\u201d, nast\u0119pnie:\n \n\tint 2; \/\/ tutaj mamy b\u0142\u0105d. \n\n<\/pre><\/div>\n\n\n<p>Taka interpretacja wynika z wy\u017cszo\u015bci priorytetu znaku przypisania \u201e=\u201d nad operatorem przecinka \u201e,\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Poprawna deklaracja zmiennej<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint y = (1, 2); \n<\/pre><\/div>\n\n\n<p>Ten kod si\u0119 skompiluje. Za pomoc\u0105 nawias\u00f3w wymuszamy wykonanie operatora przecinkowego przed przypisaniem. 1 jest odrzucane, a z operacji w nawiasie jest zwracane 2 i ostatecznie: <strong>y=2.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przypisanie warto\u015bci<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint x;\n\tx = 5, 6; \n<\/pre><\/div>\n\n\n<p>I tutaj zn\u00f3w nieintuicyjnie x b\u0119dzie mia\u0142o warto\u015b\u0107 5. Sp\u00f3jrzmy na interpretacj\u0119 kompilatora (ponownie u\u017cyjemy nawias\u00f3w do wizualizacji kolejno\u015bci operacji):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint x;\n\t(x = 5), 6;\n<\/pre><\/div>\n\n\n<p>Czyli najpierw przypisanie 5 do x. Nast\u0119pnie warto\u015b\u0107 6 nie jest nigdzie przypisywana.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przypisanie warto\u015bci + nawiasy<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint x;\n\tx = (3, 4);\n<\/pre><\/div>\n\n\n<p>Nawiasami wymuszamy wykonanie operatora przecinka: 3 jest odrzucane, 4 jest zwracane i przypisane do zmiennej x.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Obliczenie i przypisanie warto\u015bci<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\nint x;\nint y = 1;\n \nx = y += 5, y + y;\n<\/pre><\/div>\n\n\n<p>I sp\u00f3jrzmy, jak zostanie to skompilowane, zaznaczaj\u0105c nawiasami kolejno\u015b\u0107 wykonywanych operacji:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\t(x = (y += 5) ), (y + y);\n<\/pre><\/div>\n\n\n<p>Kolejny raz daje o sobie zna\u0107 najni\u017cszy priorytet operatora przecinkowego: najpierw y zostanie zwi\u0119kszane o 5, wynik zostanie przypisany do zmiennej x. Nast\u0119pnie obliczony zostanie wynik sumy y + y, kt\u00f3ry to rezultat b\u0119dzie porzucony.<\/p>\n\n\n\n<p>tak wi\u0119c ostatecznie x == 6<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Obliczenie i przypisanie warto\u015bci &#8211; drugi przyk\u0142ad<\/strong><\/h3>\n\n\n\n<p>Przyk\u0142ad podobny do poprzedniego, ale wymusimy nawiasami wykonanie operacji dla po\u017c\u0105danej kolejno\u015bci:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint x;\n\tint y = 1;\n\t\n\tx = ( y += 5, y + y );\n<\/pre><\/div>\n\n\n<p>Teraz kolejno\u015b\u0107 operacji b\u0119dzie nast\u0119puj\u0105ca:<\/p>\n\n\n\n<p>y zwi\u0119kszone o 5,<\/p>\n\n\n\n<p>obliczona suma y + y, wynik sumy zapisany do x<\/p>\n\n\n\n<p>ostatecznie x == 12<\/p>\n\n\n\n<p>W tym przyk\u0142adzie warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce mamy gwarantowan\u0105 kolejno\u015b\u0107 wykonywania operacji: najpierw jest liczone y += 5, i tak zmodyfikowana warto\u015b\u0107 y jest wykorzystana do obliczania sumy y&nbsp;+&nbsp;y. Gwarancj\u0119 tak\u0105 daje w\u0142a\u015bnie <strong>przecinek, kt\u00f3ry jest punktem sekwencyjnym<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wo\u0142anie funkcji<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tx = (Func1(), Func2(), Func3());\n<\/pre><\/div>\n\n\n<p>Zawo\u0142ane zostan\u0105 kolejno funkcje (w tej gwarantowanej kolejno\u015bci): Func1, Func2 i odrzucona zwracana przez nie warto\u015b\u0107. Ostatecznie zawo\u0142ana zostanie funkcja Func3 i wynik zostanie przypisany do zmiennej \u201ex\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Operator warunkowy (ternary operator)<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n y = (a &lt; b) ? f1(), f2() : f3(), f4();\n<\/pre><\/div>\n\n\n<p>Je\u015bli warunek a&lt;b zostanie spe\u0142niony zostanie zawo\u0142ana funkcja \u201cf1()\u201d, nast\u0119pnie zawo\u0142ana funkcja \u201cf2()\u201d i warto\u015b\u0107 przez ni\u0105 zwr\u00f3cona przypisana do zmiennej y<\/p>\n\n\n\n<p>W przeciwnym razie (gdy a&gt;=b) analogicznie zawo\u0142ana zostanie funkcja f3, nast\u0119pnie funkcja f4() i zwr\u00f3cana przez ni\u0105 warto\u015b\u0107 przypisana do zmiennej y.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Zwracanie warto\u015bci<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tint x, y;\n\t \n\tint fun(void){\n\t    return x=10, y=20; \n\t}\n<\/pre><\/div>\n\n\n<p>W linii 4 do zmiennej x zostanie przypisana warto\u015b\u0107 10. Nast\u0119pnie do zmiennej y przypisane zostanie warto\u015b\u0107 20 i ta w\u0142a\u015bnie warto\u015b\u0107 zostanie zwr\u00f3cona przez funkcj\u0119 \u201cfun()\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przecinek jako separator oraz operator \u2013 podsumowanie<\/strong><\/h2>\n\n\n\n<p>Jak wida\u0107 na podanych przyk\u0142adach, <strong>dzia\u0142anie przecinka jako operatora<\/strong> <strong>potrafi by\u0107 nieintuicyjne i nieczytelne<\/strong> ze wzgl\u0119du na odrzucanie wyniku pierwszej operacji oraz najni\u017cszego priorytetu wykonania.<\/p>\n\n\n\n<p>Jego u\u017cycie ma sens, gdy pierwszy operand powoduje tzw. efekt uboczny (side effect), kt\u00f3ry musi nast\u0105pi\u0107 przed drugim operatorem. Poniewa\u017c przecinek mo\u017ce by\u0107 separatorem lub operatorem, zale\u017cnie od kontekstu w jakim si\u0119 znajduje w kodzie, dodatkowo <strong>powoduje zwi\u0119kszenie nieczytelno\u015bci kodu i zwi\u0119ksza prawdopodobie\u0144stwo pope\u0142nienia b\u0142\u0119du<\/strong>.<\/p>\n\n\n\n<p>Nie bez powodu cz\u0119sto standardy kodowania zabraniaj\u0105 lub przynajmniej rekomenduj\u0105 nieu\u017cywanie przecinka jako operatora. Tak\u017ce bardzo rzadko mo\u017cna spotka\u0107 przecinek w postaci operatora w kodzie produkcyjnym.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czy to si\u0119 w og\u00f3le do czego\u015b przydaje?<\/strong><\/h2>\n\n\n\n<p>Czy, pomimo nieintuicyjnego dzia\u0142ania, uda nam si\u0119 znale\u017a\u0107 jakie\u015b praktyczne zastosowanie operatora przecinkowego?<\/p>\n\n\n\n<p>Cech\u0105, kt\u00f3ra mo\u017cemy postara\u0107 si\u0119 wykorzysta\u0107, jest gwarancja kolejno\u015bci wykonywania (punkt sekwencyjny). Odpowiednio wykorzystany mo\u017ce nam zaowocowa\u0107 <strong>bardziej zwi\u0119z\u0142\u0105 i czyteln\u0105 konstrukcj\u0105 kodu.<\/strong><\/p>\n\n\n\n<p>Sp\u00f3jrzmy na poni\u017csze przyk\u0142ady.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Odczyt danych i sprawdzenie warunku dla p\u0119tli while<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\tSome_type *d = &amp;some_data;\n\t \n\twhile(read_data(d), d-&gt;len &gt; 17)\n\t{\n\t  \/\/do stuff\n\t}\n<\/pre><\/div>\n\n\n<p>W tym przyk\u0142adzie skorzystamy z operatora przecinkowego, aby umie\u015bci\u0107 blisko siebie kod pobieraj\u0105cy dane potrzebne do sprawdzenia warunku wykonania p\u0119tli z kodem samego sprawdzenia warunku.<\/p>\n\n\n\n<p>Korzystaj\u0105c z cechy, i\u017c przecinek jest punktem sekwencyjnym, gwarantujemy, \u017ce read_data(d) zostanie zawsze wykonane przed sprawdzeniem warunku d-&gt;len &gt; 17.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Bardziej z\u0142o\u017cone p\u0119tle for<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\nint i, j;\n  \nfor(i=0, j=20; i&lt;j; i++, j--){\n  \/\/do stuff\n}\n<\/pre><\/div>\n\n\n<p>Podobnie jak w przyk\u0142adzie z p\u0119tl\u0105 while, w przypadku p\u0119tli for mo\u017cemy skorzysta\u0107 z operatora przecinka, aby w bardziej sp\u00f3jny i elegancki spos\u00f3b zainicjalizowa\u0107 zmienne przed wykonaniem p\u0119tli (i=0,&nbsp;j=20) oraz zmodyfikowa\u0107 \u201eliczniki\u201d p\u0119tli po ka\u017cdym jej wykonaniu (i++, j&#8211;).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Zwracanie b\u0142\u0119du<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\terr_type last_error = NO_ERROR;\n\t\n\tint fun(void){\n\t  \/\/code\n\t \n\t  if (failed){\n\t    return last_error = ERROR_CODE, -1;\n\t  }\n\t}\n<\/pre><\/div>\n\n\n<p>W tym przyk\u0142adzie funkcja zwracaj\u0105c kod b\u0142\u0119du (-1), jednocze\u015bnie ustawia zmienn\u0105 globaln\u0105 last_error na \u017c\u0105dan\u0105 warto\u015b\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Wracaj\u0105c do pytania z samego pocz\u0105tku artyku\u0142u, jestem pewien, \u017ce teraz ju\u017c bez problemu wska\u017cecie prawid\u0142ow\u0105 odpowied\u017a (c) i znajdziecie b\u0142\u0105d w linii 2 \u2013 przecinek zamiast kropki.<\/p>\n\n\n\n<p>Z b\u0142\u0119dem tego typu spotka\u0142em si\u0119 wiele lat temu w czasie analizy nieprawid\u0142owego dzia\u0142ania programu. Oczywi\u015bcie program by\u0142 du\u017co bardziej z\u0142o\u017cony i znalezienie przyczyny problemu nie by\u0142o tak trywialne.<\/p>\n\n\n\n<p><strong>B\u0142\u0105d nale\u017ca\u0142 niestety do kategorii tych \u201ewrednych\u201d<\/strong> \u2013 raz \u017ce trudno wzrokowo go znale\u017a\u0107, bo kropka od przecinka r\u00f3\u017cni si\u0119 niewiele, to dodatkowo program si\u0119 kompiluje. Je\u015bli pomy\u0142ka jest typu 1.0001 b\u0142\u0119dnie zapisane jako 1,00001, to mo\u017ce si\u0119 okaza\u0107, \u017ce dla wielu przypadk\u00f3w testowych program b\u0119dzie dzia\u0142a\u0142 prawid\u0142owo.<\/p>\n\n\n\n<p>Pozostaje pytanie: <strong>Czy u\u017cywa\u0107 przecinka jako operatora?<\/strong> Jak zwykle odpowied\u017a brzmi: To zale\u017cy.<br>I oczywi\u015bcie zale\u017cy to od was i waszych preferencji.<\/p>\n\n\n\n<p>W mojej opinii <strong>u\u017cywania operatora przecinkowego nale\u017cy unika\u0107<\/strong>, przede wszystkim dlatego, i\u017c wiele os\u00f3b go nie zna i nie rozumie zasad jego dzia\u0142ania. Je\u015bli kto\u015b b\u0119dzie poprawia\u0107 lub modyfikowa\u0107 program, w kt\u00f3rym u\u017cyto przecinka jako operatora, zapewne przysporzy mu to wielu problem\u00f3w, a mo\u017ce r\u00f3wnie\u017c spowodowa\u0107 powstanie wi\u0119kszej ilo\u015bci b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p>Zach\u0119cam was do podzielenia si\u0119 w komentarzach swoj\u0105 opini\u0105 w tym temacie. A mo\u017ce znacie jakie\u015b ciekawe konstrukcje z wykorzystaniem przecinka?<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;16215&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;5&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.2&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.2\\\/5 ( votes: 5)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Przecinek w j\u0119zyku C \u2013 do czego s\u0142u\u017cy?&quot;,&quot;width&quot;:&quot;116.3&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 116.3px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.2\/5 ( votes: 5)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zanim przejdziemy do omawiania tematu, czyli przecinka w j\u0119zyku C, mam dla Ciebie kr\u00f3ciutki programik do analizy. Spr\u00f3buj wydedukowa\u0107, jaki &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/przecinek-w-jezyku-c-do-czego-sluzy\/\">Continued<\/a><\/p>\n","protected":false},"author":230,"featured_media":19811,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":6,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1528,1529,1527],"class_list":["post-16215","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-jezyk-programowania","tag-rola-przecinka","tag-c-2"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Przecinek-w-jezyku-C-\u2013-do-czego-sluzy.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16215"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/230"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=16215"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16215\/revisions"}],"predecessor-version":[{"id":19813,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16215\/revisions\/19813"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19811"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=16215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=16215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=16215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}