{"id":1518,"date":"2026-04-28T15:35:46","date_gmt":"2026-04-28T13:35:46","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1518"},"modified":"2026-04-28T15:35:48","modified_gmt":"2026-04-28T13:35:48","slug":"print-wypisuje-dane-na-standardowe-wyjscie","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/28\/print-wypisuje-dane-na-standardowe-wyjscie\/","title":{"rendered":"Print \u2013 wypisuje dane na standardowe wyj\u015bcie"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Program zaczyna by\u0107 u\u017cyteczny dopiero wtedy, gdy potrafi komunikowa\u0107 si\u0119 z u\u017cytkownikiem lub z innym procesem. Najprostsz\u0105 form\u0105 takiej komunikacji jest wypisanie informacji na ekranie terminala, konsoli lub standardowego strumienia wyj\u015bciowego. To w\u0142a\u015bnie tam trafiaj\u0105 wyniki oblicze\u0144, komunikaty diagnostyczne, informacje o b\u0142\u0119dach i dane pomocnicze podczas testowania kodu. W praktyce od tego zaczyna si\u0119 nauka niemal ka\u017cdego j\u0119zyka programowania, poniewa\u017c funkcja Print wypisuje dane na standardowe wyj\u015bcie.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#print-wypisuje-dane-na-standardowe-wyjscie-i-dlaczego-standardowe-wyjscie-jest-podstawowym-mechanizmem-komunikacji-programu\">Print \u2013 wypisuje dane na standardowe wyj\u015bcie i dlaczego standardowe wyj\u015bcie jest podstawowym mechanizmem komunikacji programu<\/a><\/li><li><a href=\"#roznice-miedzy-print-w-pythonie-printf-w-c-oraz-cout-w-c-i-ich-rzeczywiste-zachowanie-podczas-wykonywania-programu\">R\u00f3\u017cnice mi\u0119dzy print w Pythonie printf w C oraz cout w C++ i ich rzeczywiste zachowanie podczas wykonywania programu<\/a><\/li><li><a href=\"#tabela-przykladow-podstawowego-wypisywania-danych-w-kilku-jezykach-programowania\">Tabela przyk\u0142ad\u00f3w podstawowego wypisywania danych w kilku j\u0119zykach programowania<\/a><\/li><li><a href=\"#formatowanie-danych-liczbowych-tekstowych-i-logicznych-bez-ktorego-debugowanie-szybko-staje-sie-chaotyczne\">Formatowanie danych liczbowych tekstowych i logicznych bez kt\u00f3rego debugowanie szybko staje si\u0119 chaotyczne<\/a><\/li><li><a href=\"#tabela-wzorow-i-formatowania-uzywanego-podczas-wypisywania-danych\">Tabela wzor\u00f3w i formatowania u\u017cywanego podczas wypisywania danych<\/a><\/li><li><a href=\"#print-wypisuje-dane-na-standardowe-wyjscie-podczas-debugowania-testow-i-sprawdzania-poprawnosci-algorytmu\">Print \u2013 wypisuje dane na standardowe wyj\u015bcie podczas debugowania test\u00f3w i sprawdzania poprawno\u015bci algorytmu<\/a><\/li><li><a href=\"#tabela-prostego-sledzenia-dzialania-algorytmu\">Tabela prostego \u015bledzenia dzia\u0142ania algorytmu<\/a><\/li><li><a href=\"#buforowanie-wyjscia-i-sytuacje-w-ktorych-program-nic-nie-pokazuje-mimo-ze-teoretycznie-wypisuje-dane\">Buforowanie wyj\u015bcia i sytuacje w kt\u00f3rych program nic nie pokazuje mimo \u017ce teoretycznie wypisuje dane<\/a><\/li><li><a href=\"#print-wypisuje-dane-na-standardowe-wyjscie-ale-nie-powinien-zastepowac-logowania-i-obslugi-bledow\">Print \u2013 wypisuje dane na standardowe wyj\u015bcie ale nie powinien zast\u0119powa\u0107 logowania i obs\u0142ugi b\u0142\u0119d\u00f3w<\/a><\/li><li><a href=\"#najczestsze-bledy-poczatkujacych-i-sytuacje-ktore-powoduja-nieczytelne-lub-bledne-wyniki\">Najcz\u0119stsze b\u0142\u0119dy pocz\u0105tkuj\u0105cych i sytuacje kt\u00f3re powoduj\u0105 nieczytelne lub b\u0142\u0119dne wyniki<\/a><ol><li><a href=\"#brak-znaku-nowej-linii\">Brak znaku nowej linii<\/a><\/li><li><a href=\"#zly-specyfikator-formatu-w-c\">Z\u0142y specyfikator formatu w C<\/a><\/li><li><a href=\"#wypisywanie-zbyt-duzej-ilosci-danych\">Wypisywanie zbyt du\u017cej ilo\u015bci danych<\/a><\/li><li><a href=\"#brak-opisu-wartosci\">Brak opisu warto\u015bci<\/a><\/li><li><a href=\"#mylenie-stdout-i-stderr\">Mylenie stdout i stderr<\/a><\/li><\/ol><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-print-i-printf-to-dokladnie-to-samo\">Czy print i printf to dok\u0142adnie to samo<\/a><\/li><li><a href=\"#dlaczego-w-c-trzeba-uzywac-procentow-jak-d-i-f\">Dlaczego w C trzeba u\u017cywa\u0107 procent\u00f3w jak %d i %f<\/a><\/li><li><a href=\"#po-co-istnieje-stderr-skoro-jest-juz-stdout\">Po co istnieje stderr skoro jest ju\u017c stdout<\/a><\/li><li><a href=\"#czy-print-nadaje-sie-do-debugowania-duzych-projektow\">Czy print nadaje si\u0119 do debugowania du\u017cych projekt\u00f3w<\/a><\/li><li><a href=\"#dlaczego-program-czasem-nie-pokazuje-tekstu-od-razu\">Dlaczego program czasem nie pokazuje tekstu od razu<\/a><\/li><li><a href=\"#czy-wypisywanie-danych-wplywa-na-wydajnosc\">Czy wypisywanie danych wp\u0142ywa na wydajno\u015b\u0107<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"print-wypisuje-dane-na-standardowe-wyjscie-i-dlaczego-standardowe-wyjscie-jest-podstawowym-mechanizmem-komunikacji-programu\">Print \u2013 wypisuje dane na standardowe wyj\u015bcie i dlaczego standardowe wyj\u015bcie jest podstawowym mechanizmem komunikacji programu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Standardowe wyj\u015bcie, czyli standard output (stdout), to jeden z podstawowych strumieni wej\u015bcia i wyj\u015bcia procesu. System operacyjny udost\u0119pnia zwykle trzy g\u0142\u00f3wne strumienie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>standard input (stdin) \u2013 wej\u015bcie danych<\/li>\n\n\n\n<li>standard output (stdout) \u2013 zwyk\u0142e wyj\u015bcie programu<\/li>\n\n\n\n<li>standard error (stderr) \u2013 komunikaty b\u0142\u0119d\u00f3w<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy program u\u017cywa instrukcji wypisywania tekstu, domy\u015blnie trafia on w\u0142a\u015bnie do stdout. Najcz\u0119\u015bciej u\u017cytkownik widzi to jako tekst w terminalu, ale technicznie mo\u017ce to by\u0107 tak\u017ce plik, potok lub przekierowanie do innego programu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To wa\u017cne, bo wypisanie danych nie oznacza wy\u0142\u0105cznie \u201epokazania czego\u015b na ekranie\u201d. Oznacza zapis do konkretnego strumienia, kt\u00f3ry mo\u017ce by\u0107 dalej przetwarzany.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad praktyczny:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">program generuje raport \u2192 stdout trafia do pliku<br>program zwraca list\u0119 proces\u00f3w \u2192 stdout trafia do polecenia grep<br>program loguje b\u0142\u0119dy \u2192 stderr trafia osobno do dziennika b\u0142\u0119d\u00f3w<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To rozr\u00f3\u017cnienie jest bardzo istotne przy pracy administracyjnej, automatyzacji i debugowaniu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"roznice-miedzy-print-w-pythonie-printf-w-c-oraz-cout-w-c-i-ich-rzeczywiste-zachowanie-podczas-wykonywania-programu\">R\u00f3\u017cnice mi\u0119dzy print w Pythonie printf w C oraz cout w C++ i ich rzeczywiste zachowanie podczas wykonywania programu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cne j\u0119zyki realizuj\u0105 wypisywanie danych inaczej, ale cel pozostaje ten sam: przekazanie informacji do stdout.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Python u\u017cywa najcz\u0119\u015bciej funkcji <code>print()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C bardzo cz\u0119sto korzysta z funkcji <code>printf()<\/code> z biblioteki standardowej <code>stdio.h<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C++ wykorzystuje operator strumieniowy <code>&lt;&lt;<\/code> wraz z <code>std::cout<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PHP stosuje <code>echo<\/code> lub <code>print<\/code>, cho\u0107 technicznie s\u0105 to konstrukcje j\u0119zykowe, a nie klasyczne funkcje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsza r\u00f3\u017cnica dotyczy formatowania danych. W Pythonie wiele rzeczy dzieje si\u0119 automatycznie, natomiast w C programista musi jawnie okre\u015bli\u0107 typ danych przez odpowiedni specyfikator formatu, np. <code>%d<\/code>, <code>%f<\/code>, <code>%s<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">B\u0142\u0105d w specyfikatorze formatu w C mo\u017ce prowadzi\u0107 nie tylko do z\u0142ego wyniku, ale nawet do b\u0142\u0119d\u00f3w pami\u0119ci. W Pythonie takie ryzyko jest du\u017co mniejsze.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tabela-przykladow-podstawowego-wypisywania-danych-w-kilku-jezykach-programowania\">Tabela przyk\u0142ad\u00f3w podstawowego wypisywania danych w kilku j\u0119zykach programowania<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad kodu<\/th><th>Co si\u0119 dzieje<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nliczba = 25\\nprint(\\\"Wynik:\\\", liczba)\\n<\/code><\/td><td>Python automatycznie konwertuje liczb\u0119 na tekst i dodaje spacj\u0119 mi\u0119dzy argumentami<\/td><\/tr><tr><td>C<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int liczba = 25;\\n printf(\\\"Wynik: %d\\\\n\\\", liczba);\\n return 0;\\n}\\n<\/code><\/td><td><code>%d<\/code> oznacza liczb\u0119 ca\u0142kowit\u0105 typu int<\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n int liczba = 25;\\n cout &lt;&lt; \\\"Wynik: \\\" &lt;&lt; liczba &lt;&lt; endl;\\n return 0;\\n}\\n<\/code><\/td><td><code>endl<\/code> ko\u0144czy lini\u0119 i wymusza opr\u00f3\u017cnienie bufora<\/td><\/tr><tr><td>PHP<\/td><td><code>php\\n&lt;?php\\n$liczba = 25;\\necho \\\"Wynik: \\\" . $liczba;\\n?&gt;\\n<\/code><\/td><td>Operator <code>.<\/code> s\u0142u\u017cy do \u0142\u0105czenia tekstu<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"formatowanie-danych-liczbowych-tekstowych-i-logicznych-bez-ktorego-debugowanie-szybko-staje-sie-chaotyczne\">Formatowanie danych liczbowych tekstowych i logicznych bez kt\u00f3rego debugowanie szybko staje si\u0119 chaotyczne<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Samo wypisanie warto\u015bci zwykle nie wystarcza. Trzeba jeszcze zadba\u0107 o czytelno\u015b\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi program przetwarza 1000 rekord\u00f3w, komunikat:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>123<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">jest praktycznie bezu\u017cyteczny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Znacznie lepiej wygl\u0105da:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Liczba przetworzonych rekord\u00f3w: 123<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czytelne komunikaty skracaj\u0105 czas debugowania. To realna oszcz\u0119dno\u015b\u0107 godzin pracy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Szczeg\u00f3lnie wa\u017cne jest:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>oznaczanie nazw zmiennych<\/li>\n\n\n\n<li>kontrola liczby miejsc po przecinku<\/li>\n\n\n\n<li>wypisywanie separator\u00f3w<\/li>\n\n\n\n<li>rozr\u00f3\u017cnianie informacji roboczych i b\u0142\u0119d\u00f3w<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tabela-wzorow-i-formatowania-uzywanego-podczas-wypisywania-danych\">Tabela wzor\u00f3w i formatowania u\u017cywanego podczas wypisywania danych<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zastosowanie<\/th><th>Wz\u00f3r \/ zapis<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>Liczba ca\u0142kowita w C<\/td><td><code>%d<\/code><\/td><td>typ <code>int<\/code><\/td><\/tr><tr><td>Liczba zmiennoprzecinkowa w C<\/td><td><code>%.2f<\/code><\/td><td>dwa miejsca po przecinku<\/td><\/tr><tr><td>\u0141a\u0144cuch znak\u00f3w w C<\/td><td><code>%s<\/code><\/td><td>tekst<\/td><\/tr><tr><td>Python formatowany<\/td><td><code>f\"Wynik = {x}\"<\/code><\/td><td>interpolacja tekstu<\/td><\/tr><tr><td>C++ strumie\u0144<\/td><td><code>cout &lt;&lt; x<\/code><\/td><td>operator wypisywania<\/td><\/tr><tr><td>Nowa linia<\/td><td><code>\\n<\/code><\/td><td>przej\u015bcie do nast\u0119pnej linii<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"print-wypisuje-dane-na-standardowe-wyjscie-podczas-debugowania-testow-i-sprawdzania-poprawnosci-algorytmu\">Print \u2013 wypisuje dane na standardowe wyj\u015bcie podczas debugowania test\u00f3w i sprawdzania poprawno\u015bci algorytmu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce pocz\u0105tkuj\u0105cy cz\u0119sto traktuj\u0105 wypisywanie jako co\u015b prostego i ma\u0142o wa\u017cnego, ale w\u0142a\u015bnie ono ratuje wi\u0119kszo\u015b\u0107 pierwszych b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">algorytm sortowania dzia\u0142a \u017ale<br>wynik ko\u0144cowy jest b\u0142\u0119dny<br>nie wiadomo, na kt\u00f3rym etapie pojawia si\u0119 problem<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najprostsza metoda:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">wypisywa\u0107 stan tablicy po ka\u017cdym kroku.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To nie jest eleganckie, ale jest skuteczne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debugger bywa dok\u0142adniejszy, jednak print-debugging nadal jest jedn\u0105 z najcz\u0119\u015bciej stosowanych metod, szczeg\u00f3lnie w systemach wbudowanych, skryptach serwerowych i programach dzia\u0142aj\u0105cych na zdalnych maszynach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W wielu przypadkach dost\u0119p do pe\u0142nego debuggera jest utrudniony, a zwyk\u0142y komunikat tekstowy daje natychmiastow\u0105 odpowied\u017a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tabela-prostego-sledzenia-dzialania-algorytmu\">Tabela prostego \u015bledzenia dzia\u0142ania algorytmu<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad kodu<\/th><th>Zastosowanie<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nfor i in range(5):\\n print(\\\"Iteracja:\\\", i)\\n<\/code><\/td><td>kontrola przebiegu p\u0119tli<\/td><\/tr><tr><td>C<\/td><td><code>c\\nfor(int i = 0; i &lt; 5; i++) {\\n printf(\\\"Iteracja: %d\\\\n\\\", i);\\n}\\n<\/code><\/td><td>sprawdzenie warunku zako\u0144czenia<\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\nfor(int i = 0; i &lt; 5; i++) {\\n cout &lt;&lt; \\\"Iteracja: \\\" &lt;&lt; i &lt;&lt; endl;\\n}\\n<\/code><\/td><td>analiza kolejnych krok\u00f3w<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"buforowanie-wyjscia-i-sytuacje-w-ktorych-program-nic-nie-pokazuje-mimo-ze-teoretycznie-wypisuje-dane\">Buforowanie wyj\u015bcia i sytuacje w kt\u00f3rych program nic nie pokazuje mimo \u017ce teoretycznie wypisuje dane<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To cz\u0119sty problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Programista pisze kod, uruchamia go i\u2026 nic nie wida\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pow\u00f3d cz\u0119sto jest prosty: buforowanie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">System nie zawsze wysy\u0142a dane natychmiast na ekran. Cz\u0119\u015b\u0107 danych trafia najpierw do bufora i zostaje pokazana dopiero p\u00f3\u017aniej, np.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>po znaku nowej linii<\/li>\n\n\n\n<li>po zape\u0142nieniu bufora<\/li>\n\n\n\n<li>po r\u0119cznym wymuszeniu opr\u00f3\u017cnienia<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W C <code>printf(\"test\");<\/code> bez <code>\\n<\/code> mo\u017ce nie wy\u015bwietli\u0107 nic od razu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ <code>std::endl<\/code> nie tylko ko\u0144czy lini\u0119, ale tak\u017ce opr\u00f3\u017cnia bufor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie mo\u017cna u\u017cy\u0107:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>print(\"test\", flush=True)<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przy aplikacjach sieciowych, systemach embedded i automatycznych testach to ma du\u017ce znaczenie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"print-wypisuje-dane-na-standardowe-wyjscie-ale-nie-powinien-zastepowac-logowania-i-obslugi-bledow\">Print \u2013 wypisuje dane na standardowe wyj\u015bcie ale nie powinien zast\u0119powa\u0107 logowania i obs\u0142ugi b\u0142\u0119d\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na pocz\u0105tku wszystko wypisuje si\u0119 przez print. P\u00f3\u017aniej zaczyna to przeszkadza\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi system dzia\u0142a produkcyjnie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>trzeba rozdziela\u0107 informacje u\u017cytkownika od log\u00f3w technicznych<\/li>\n\n\n\n<li>b\u0142\u0119dy powinny trafia\u0107 do stderr lub systemu logowania<\/li>\n\n\n\n<li>dane diagnostyczne nie powinny za\u015bmieca\u0107 zwyk\u0142ego wyniku programu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego print nie zast\u0119puje loggera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla ma\u0142ych program\u00f3w edukacyjnych wystarcza. Dla wi\u0119kszych system\u00f3w potrzebne s\u0105 mechanizmy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>logging w Pythonie<\/li>\n\n\n\n<li>syslog<\/li>\n\n\n\n<li>dzienniki aplikacyjne<\/li>\n\n\n\n<li>monitoring proces\u00f3w<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Brak tego podzia\u0142u powoduje bardzo realne straty czasu. Administrator szuka b\u0142\u0119du godzinami, bo komunikaty s\u0105 pomieszane z normalnym wynikiem programu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-bledy-poczatkujacych-i-sytuacje-ktore-powoduja-nieczytelne-lub-bledne-wyniki\">Najcz\u0119stsze b\u0142\u0119dy pocz\u0105tkuj\u0105cych i sytuacje kt\u00f3re powoduj\u0105 nieczytelne lub b\u0142\u0119dne wyniki<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stsze problemy:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brak-znaku-nowej-linii\">Brak znaku nowej linii<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik staje si\u0119 nieczytelny, kolejne komunikaty sklejaj\u0105 si\u0119 w jeden ci\u0105g.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zly-specyfikator-formatu-w-c\">Z\u0142y specyfikator formatu w C<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>%d<\/code> zamiast <code>%f<\/code> daje b\u0142\u0119dne dane lub nieprzewidywalne zachowanie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wypisywanie-zbyt-duzej-ilosci-danych\">Wypisywanie zbyt du\u017cej ilo\u015bci danych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Debugowanie zamienia si\u0119 w chaos. Lepiej wypisywa\u0107 konkretne punkty kontrolne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brak-opisu-wartosci\">Brak opisu warto\u015bci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sama liczba bez kontekstu zwykle nic nie znaczy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mylenie-stdout-i-stderr\">Mylenie stdout i stderr<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">B\u0142\u0119dy trafiaj\u0105 tam, gdzie powinny by\u0107 zwyk\u0142e dane, co utrudnia automatyzacj\u0119.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-print-i-printf-to-dokladnie-to-samo\">Czy print i printf to dok\u0142adnie to samo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Cel jest podobny, ale mechanizm inny. <code>print()<\/code> w Pythonie dzia\u0142a bardziej automatycznie, natomiast <code>printf()<\/code> w C wymaga jawnego okre\u015blenia formatu danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-w-c-trzeba-uzywac-procentow-jak-d-i-f\">Dlaczego w C trzeba u\u017cywa\u0107 procent\u00f3w jak %d i %f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>printf()<\/code> musi wiedzie\u0107, jaki typ danych ma wypisa\u0107. <code>%d<\/code> oznacza liczb\u0119 ca\u0142kowit\u0105, <code>%f<\/code> liczb\u0119 zmiennoprzecinkow\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"po-co-istnieje-stderr-skoro-jest-juz-stdout\">Po co istnieje stderr skoro jest ju\u017c stdout<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo b\u0142\u0119dy powinny by\u0107 oddzielone od zwyk\u0142ego wyniku programu. Dzi\u0119ki temu mo\u017cna osobno zapisywa\u0107 wyniki i osobno analizowa\u0107 problemy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-print-nadaje-sie-do-debugowania-duzych-projektow\">Czy print nadaje si\u0119 do debugowania du\u017cych projekt\u00f3w<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Do szybkiego sprawdzenia tak, ale w wi\u0119kszych systemach lepiej u\u017cywa\u0107 logger\u00f3w i narz\u0119dzi diagnostycznych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-program-czasem-nie-pokazuje-tekstu-od-razu\">Dlaczego program czasem nie pokazuje tekstu od razu<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej przez buforowanie. Dane trafiaj\u0105 najpierw do pami\u0119ci tymczasowej i dopiero p\u00f3\u017aniej s\u0105 wy\u015bwietlane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-wypisywanie-danych-wplywa-na-wydajnosc\">Czy wypisywanie danych wp\u0142ywa na wydajno\u015b\u0107<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. Bardzo cz\u0119ste operacje wyj\u015bcia, szczeg\u00f3lnie w p\u0119tlach, mog\u0105 mocno spowolni\u0107 program. W testach wydajno\u015bciowych trzeba to bra\u0107 pod uwag\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instrukcja wypisywania danych wydaje si\u0119 banalna tylko na pocz\u0105tku. P\u00f3\u017aniej okazuje si\u0119, \u017ce od jako\u015bci komunikat\u00f3w zale\u017cy szybko\u015b\u0107 diagnozowania b\u0142\u0119d\u00f3w, poprawno\u015b\u0107 test\u00f3w i wygoda pracy z ca\u0142ym systemem. Dobrze napisany program nie tylko liczy poprawnie, ale te\u017c jasno pokazuje, co w\u0142a\u015bnie robi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Program zaczyna by\u0107 u\u017cyteczny dopiero wtedy, gdy potrafi komunikowa\u0107 si\u0119 z u\u017cytkownikiem lub z innym procesem. Najprostsz\u0105 form\u0105 takiej komunikacji jest wypisanie informacji na ekranie terminala, konsoli lub standardowego strumienia wyj\u015bciowego. To w\u0142a\u015bnie tam trafiaj\u0105 wyniki oblicze\u0144, komunikaty diagnostyczne, informacje o b\u0142\u0119dach i dane pomocnicze podczas testowania kodu. W praktyce od tego zaczyna si\u0119 nauka niemal ka\u017cdego j\u0119zyka programowania, poniewa\u017c funkcja Print wypisuje dane na standardowe wyj\u015bcie. Print \u2013 wypisuje dane na standardowe wyj\u015bcie i dlaczego standardowe wyj\u015bcie jest podstawowym mechanizmem komunikacji programu Standardowe wyj\u015bcie, czyli standard output (stdout), to jeden z podstawowych strumieni wej\u015bcia i wyj\u015bcia procesu. System operacyjny udost\u0119pnia zwykle trzy g\u0142\u00f3wne strumienie: Gdy program u\u017cywa instrukcji wypisywania tekstu, domy\u015blnie trafia on w\u0142a\u015bnie do stdout. Najcz\u0119\u015bciej u\u017cytkownik widzi to jako tekst w terminalu, ale technicznie mo\u017ce to by\u0107 tak\u017ce plik, potok lub przekierowanie do innego programu. To wa\u017cne, bo wypisanie danych nie oznacza wy\u0142\u0105cznie \u201epokazania czego\u015b na ekranie\u201d. Oznacza zapis do konkretnego strumienia, kt\u00f3ry mo\u017ce by\u0107 dalej przetwarzany. Przyk\u0142ad praktyczny: program generuje raport \u2192 stdout trafia do plikuprogram zwraca list\u0119 proces\u00f3w \u2192 stdout trafia do polecenia grepprogram loguje b\u0142\u0119dy \u2192 stderr trafia osobno do dziennika b\u0142\u0119d\u00f3w To rozr\u00f3\u017cnienie jest bardzo istotne przy pracy administracyjnej, automatyzacji i debugowaniu. R\u00f3\u017cnice mi\u0119dzy print w Pythonie printf w C oraz cout w C++ i ich rzeczywiste zachowanie podczas wykonywania programu R\u00f3\u017cne j\u0119zyki realizuj\u0105 wypisywanie danych inaczej, ale cel pozostaje ten sam: przekazanie informacji do stdout. Python u\u017cywa najcz\u0119\u015bciej funkcji print(). C bardzo cz\u0119sto korzysta z funkcji printf() z biblioteki standardowej stdio.h. C++ wykorzystuje operator strumieniowy &lt;&lt; wraz z std::cout. PHP stosuje echo lub print, cho\u0107 technicznie s\u0105 to konstrukcje j\u0119zykowe, a nie klasyczne funkcje. Najwa\u017cniejsza r\u00f3\u017cnica dotyczy formatowania danych. W Pythonie wiele rzeczy dzieje si\u0119 automatycznie, natomiast w C programista musi jawnie okre\u015bli\u0107 typ danych przez odpowiedni specyfikator formatu, np. %d, %f, %s. B\u0142\u0105d w specyfikatorze formatu w C mo\u017ce prowadzi\u0107 nie tylko do z\u0142ego wyniku, ale nawet do b\u0142\u0119d\u00f3w pami\u0119ci. W Pythonie takie ryzyko jest du\u017co mniejsze. Tabela przyk\u0142ad\u00f3w podstawowego wypisywania danych w kilku j\u0119zykach programowania J\u0119zyk Przyk\u0142ad kodu Co si\u0119 dzieje Python python\\nliczba = 25\\nprint(\\&#8221;Wynik:\\&#8221;, liczba)\\n Python automatycznie konwertuje liczb\u0119 na tekst i dodaje spacj\u0119 mi\u0119dzy argumentami C c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int liczba = 25;\\n printf(\\&#8221;Wynik: %d\\\\n\\&#8221;, liczba);\\n return 0;\\n}\\n %d oznacza liczb\u0119 ca\u0142kowit\u0105 typu int C++ cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n int liczba = 25;\\n cout &lt;&lt; \\&#8221;Wynik: \\&#8221; &lt;&lt; liczba &lt;&lt; endl;\\n return 0;\\n}\\n endl ko\u0144czy lini\u0119 i wymusza opr\u00f3\u017cnienie bufora PHP php\\n&lt;?php\\n$liczba = 25;\\necho \\&#8221;Wynik: \\&#8221; . $liczba;\\n?&gt;\\n Operator . s\u0142u\u017cy do \u0142\u0105czenia tekstu Formatowanie danych liczbowych tekstowych i logicznych bez kt\u00f3rego debugowanie szybko staje si\u0119 chaotyczne Samo wypisanie warto\u015bci zwykle nie wystarcza. Trzeba jeszcze zadba\u0107 o czytelno\u015b\u0107. Je\u017celi program przetwarza 1000 rekord\u00f3w, komunikat: 123 jest praktycznie bezu\u017cyteczny. Znacznie lepiej wygl\u0105da: Liczba przetworzonych rekord\u00f3w: 123 Czytelne komunikaty skracaj\u0105 czas debugowania. To realna oszcz\u0119dno\u015b\u0107 godzin pracy. Szczeg\u00f3lnie wa\u017cne jest: Tabela wzor\u00f3w i formatowania u\u017cywanego podczas wypisywania danych Zastosowanie Wz\u00f3r \/ zapis Znaczenie Liczba ca\u0142kowita w C %d typ int Liczba zmiennoprzecinkowa w C %.2f dwa miejsca po przecinku \u0141a\u0144cuch znak\u00f3w w C %s tekst Python formatowany f&#8221;Wynik = {x}&#8221; interpolacja tekstu C++ strumie\u0144 cout &lt;&lt; x operator wypisywania Nowa linia \\n przej\u015bcie do nast\u0119pnej linii Print \u2013 wypisuje dane na standardowe wyj\u015bcie podczas debugowania test\u00f3w i sprawdzania poprawno\u015bci algorytmu W praktyce pocz\u0105tkuj\u0105cy cz\u0119sto traktuj\u0105 wypisywanie jako co\u015b prostego i ma\u0142o wa\u017cnego, ale w\u0142a\u015bnie ono ratuje wi\u0119kszo\u015b\u0107 pierwszych b\u0142\u0119d\u00f3w. Przyk\u0142ad: algorytm sortowania dzia\u0142a \u017alewynik ko\u0144cowy jest b\u0142\u0119dnynie wiadomo, na kt\u00f3rym etapie pojawia si\u0119 problem Najprostsza metoda: wypisywa\u0107 stan tablicy po ka\u017cdym kroku. To nie jest eleganckie, ale jest skuteczne. Debugger bywa dok\u0142adniejszy, jednak print-debugging nadal jest jedn\u0105 z najcz\u0119\u015bciej stosowanych metod, szczeg\u00f3lnie w systemach wbudowanych, skryptach serwerowych i programach dzia\u0142aj\u0105cych na zdalnych maszynach. W wielu przypadkach dost\u0119p do pe\u0142nego debuggera jest utrudniony, a zwyk\u0142y komunikat tekstowy daje natychmiastow\u0105 odpowied\u017a. Tabela prostego \u015bledzenia dzia\u0142ania algorytmu J\u0119zyk Przyk\u0142ad kodu Zastosowanie Python python\\nfor i in range(5):\\n print(\\&#8221;Iteracja:\\&#8221;, i)\\n kontrola przebiegu p\u0119tli C c\\nfor(int i = 0; i &lt; 5; i++) {\\n printf(\\&#8221;Iteracja: %d\\\\n\\&#8221;, i);\\n}\\n sprawdzenie warunku zako\u0144czenia C++ cpp\\nfor(int i = 0; i &lt; 5; i++) {\\n cout &lt;&lt; \\&#8221;Iteracja: \\&#8221; &lt;&lt; i &lt;&lt; endl;\\n}\\n analiza kolejnych krok\u00f3w Buforowanie wyj\u015bcia i sytuacje w kt\u00f3rych program nic nie pokazuje mimo \u017ce teoretycznie wypisuje dane To cz\u0119sty problem. Programista pisze kod, uruchamia go i\u2026 nic nie wida\u0107. Pow\u00f3d cz\u0119sto jest prosty: buforowanie. System nie zawsze wysy\u0142a dane natychmiast na ekran. Cz\u0119\u015b\u0107 danych trafia najpierw do bufora i zostaje pokazana dopiero p\u00f3\u017aniej, np.: W C printf(&#8222;test&#8221;); bez \\n mo\u017ce nie wy\u015bwietli\u0107 nic od razu. W C++ std::endl nie tylko ko\u0144czy lini\u0119, ale tak\u017ce opr\u00f3\u017cnia bufor. W Pythonie mo\u017cna u\u017cy\u0107: print(&#8222;test&#8221;, flush=True) Przy aplikacjach sieciowych, systemach embedded i automatycznych testach to ma du\u017ce znaczenie. Print \u2013 wypisuje dane na standardowe wyj\u015bcie ale nie powinien zast\u0119powa\u0107 logowania i obs\u0142ugi b\u0142\u0119d\u00f3w Na pocz\u0105tku wszystko wypisuje si\u0119 przez print. P\u00f3\u017aniej zaczyna to przeszkadza\u0107. Je\u017celi system dzia\u0142a produkcyjnie: Dlatego print nie zast\u0119puje loggera. Dla ma\u0142ych program\u00f3w edukacyjnych wystarcza. Dla wi\u0119kszych system\u00f3w potrzebne s\u0105 mechanizmy: Brak tego podzia\u0142u powoduje bardzo realne straty czasu. Administrator szuka b\u0142\u0119du godzinami, bo komunikaty s\u0105 pomieszane z normalnym wynikiem programu. Najcz\u0119stsze b\u0142\u0119dy pocz\u0105tkuj\u0105cych i sytuacje kt\u00f3re powoduj\u0105 nieczytelne lub b\u0142\u0119dne wyniki Najcz\u0119stsze problemy: Brak znaku nowej linii Wynik staje si\u0119 nieczytelny, kolejne komunikaty sklejaj\u0105 si\u0119 w jeden ci\u0105g. Z\u0142y specyfikator formatu w C %d zamiast %f daje b\u0142\u0119dne dane lub nieprzewidywalne zachowanie. Wypisywanie zbyt du\u017cej ilo\u015bci danych Debugowanie zamienia si\u0119 w chaos. Lepiej wypisywa\u0107 konkretne punkty kontrolne. Brak opisu warto\u015bci Sama liczba bez kontekstu zwykle nic nie znaczy. Mylenie stdout i stderr B\u0142\u0119dy trafiaj\u0105 tam, gdzie powinny by\u0107 zwyk\u0142e dane, co utrudnia automatyzacj\u0119. FAQ Czy print i printf to dok\u0142adnie to samo Nie. Cel jest podobny, ale mechanizm inny. print() w Pythonie dzia\u0142a bardziej automatycznie, natomiast printf() w C wymaga jawnego okre\u015blenia formatu danych. Dlaczego w C trzeba u\u017cywa\u0107 procent\u00f3w jak %d i %f Funkcja printf() musi wiedzie\u0107, jaki typ danych ma wypisa\u0107. %d oznacza liczb\u0119 ca\u0142kowit\u0105, %f liczb\u0119 zmiennoprzecinkow\u0105. Po co istnieje stderr skoro jest ju\u017c stdout Bo b\u0142\u0119dy powinny by\u0107 oddzielone od zwyk\u0142ego wyniku programu. Dzi\u0119ki temu mo\u017cna osobno zapisywa\u0107 wyniki i osobno analizowa\u0107 problemy. Czy print nadaje si\u0119 do debugowania du\u017cych projekt\u00f3w Do szybkiego sprawdzenia tak, ale w wi\u0119kszych systemach lepiej u\u017cywa\u0107 logger\u00f3w i narz\u0119dzi diagnostycznych. Dlaczego program czasem nie pokazuje tekstu od razu Najcz\u0119\u015bciej przez buforowanie. Dane trafiaj\u0105 najpierw do pami\u0119ci tymczasowej i dopiero p\u00f3\u017aniej s\u0105 wy\u015bwietlane. Czy wypisywanie danych wp\u0142ywa na wydajno\u015b\u0107 Tak. Bardzo cz\u0119ste operacje wyj\u015bcia, szczeg\u00f3lnie w p\u0119tlach, mog\u0105 mocno spowolni\u0107 program. W testach wydajno\u015bciowych trzeba to bra\u0107 pod uwag\u0119. Instrukcja wypisywania danych wydaje si\u0119 banalna tylko na pocz\u0105tku. P\u00f3\u017aniej okazuje si\u0119, \u017ce od jako\u015bci komunikat\u00f3w zale\u017cy szybko\u015b\u0107 diagnozowania b\u0142\u0119d\u00f3w, poprawno\u015b\u0107 test\u00f3w i wygoda pracy z ca\u0142ym systemem. Dobrze napisany program nie tylko liczy poprawnie, ale te\u017c jasno pokazuje, co w\u0142a\u015bnie robi. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1519,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1518","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1518"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1518\/revisions"}],"predecessor-version":[{"id":1520,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1518\/revisions\/1520"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1519"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}