helyett a hagyományos ? Növekszik típusú biztonsági, csökkentse a hibákat, hadd" />

C - printf elleni cout a c, kód q - egy orosz (ru)

[15.1] Miért érdemes használni ahelyett, hogy a hagyományos ?

Növekszik típusú biztonsági, csökkentse a hibákat, és biztosítja a skálázhatóságot lehetővé örökséget.

printf (). nem lehet törött, és scanf (). esetleg alkalmas az élet, annak ellenére, hogy ez alá a hibákat, de mindkettő korlátozottak, hogy mit tehet a C ++ I / O C ++ I / O (a <<и>>) A relatív C (egy printf () és scanf ()):

  • Biztonságosabb típusa: segítségével objektum típusát, amely az I / O'd, statikusan ismert fordító. Éppen ellenkezőleg, a „%” mező határozza meg a dinamikus típus.
  • Kevesebb hibákat: a extra zsetont „%”, amelynek meg kell egyeznie a tényleges tárgyak, amelyek I / O'd. Eltávolítása redundancia eltávolítja osztályába hibákat.
  • Bővíthetőség: a mechanizmus a C ++ Ez lehetővé teszi a felhasználó számára, hogy adja meg az új típusú I / O'd feltörése nélkül a meglévő kódot. Képzeld el, a káosz, ha mindenki egyszerre hozzá új összeegyeztethetetlen mező „%” a printf () és a scanf ().
  • Örökölhető: a mechanizmus a C ++ Ebből épült a valódi osztályok, mint a std :: ostream és std :: istream_FAR. különböző „FILE *. ezek igazi osztályok és így örökölhető. Ez azt jelenti, hogy lehet, hogy más felhasználó által definiált dolgok úgy néz ki és úgy viselkednek, mint patakok, de mégis csinál valamit különös és csodálatos. Automatikusan használhatja tsiliony sorokat írta a felhasználók az I / O-kódot, amit nem is tudom, és nem kell tudni az osztály „felerősítés folyam”.

Meglep, hogy mindenki ebben a kérdésben azt állítják, hogy std :: cout jobb, mint a printf. akkor is, ha a szóban forgó csak feltett egy kérdést, ami a különbségeket. Most van egy különbség - std :: cout - ez a C ++ és printf - C (de lehet használni azt a C ++, mint minden mást, a C). Most őszinte leszek itt; És a printf és std :: cout megvannak az előnyei.

nyújthatóság

std :: cout bővíthető. Tudom, az emberek azt mondják, hogy a printf bővíteni, de ez a bővítés nem szerepel a szabványos C (tehát meg kell használni nem szabványos funkciók, de nincs általános, nem szabványos funkciók), és ezeket a kiterjesztéseket egy (Így könnyen összeütközésbe meglévő formátum) .

Ellentétben printf. std :: cout teljesen függ operátor túlterhelés, így nincsenek problémák egyéni formátumok - minden, amit teszel, ez a definíciója egy szubrutin, amelyben std :: ostream az első érv, és a típus - a második. Így nincs gond a névtér, mert van egy osztály (ami nem korlátozódik egyetlen karakter), akkor lehet, hogy az std :: ostream túlterhelés std :: ostream.

Ugyanakkor kétlem, hogy sokan akarnak majd bővíteni a ostream (hogy őszinte legyek, én ritkán láttam ilyen kiterjesztéseket, akkor is, ha azok könnyen megoldható). Azonban itt, ha szükség van rá.

Mint látható, és a printf és std :: cout használ egy másik szintaxis. printf függvény a standard szintaxis sablon segítségével vonal és változó hosszúságú argumentumlistát. Tény, hogy a printf az oka, hogy C őket - printf formátum túl bonyolult, hogy fel lehet használni anélkül, hogy őket. Azonban std :: cout használ egy másik API - üzemeltető <

Ez általában azt jelenti, hogy a C változat rövidebb lesz, de a legtöbb esetben ez nem számít. A különbség észrevehető, ha nyomtatni Sok érv. Ha kell írni valami ilyesmit Hiba 2: A fájl nem található. Feltételezve, hogy a hiba számát és leírását helyőrzőnevet, a kód így fog kinézni. Mindkét példa ugyanúgy működik (jó, egyfajta, std :: Endl ténylegesen visszaállítja a puffer).

Bár ez nem tűnik túl őrült (ez kétszer annyi), akkor kap bolondabb, ha valóban formázza az érveket, nem csak nyomtatni. Például a nyomtatás valami hasonló 0x0424 csak őrült. Ezt az okozza, hogy a keverési állapotban std :: cout és a tényleges értékek. Még soha nem láttam a nyelvet, ahol olyasmi, mint egy std :: setfill lenne típusát (kivéve a C ++, természetesen). printf egyértelműen elkülöníti az érveket és a tényleges típusát. Azt szeretnénk tartani a változat printf (akkor is, ha úgy néz ki, inkább rejtélyes), mint a saját verzióját a iostream (mert túl sok a zaj).

Ebben rejlik az igazi előnye printf. printf is. vonalon. Ez teszi nagyon könnyű lefordítani, míg üzemben <<злоупотребление iostream. Предполагая, что функция gettext() переводится, и вы хотите показать Error 2: File not found. Код для перевода ранее показанной строки формата будет выглядеть так:

Most tegyük fel, hogy lefordítani Fictionish, ahol a hibák száma, miután a leírás. Fordított szöveges fog kinézni% 2 $ s oru% 1 $ d. \ N Most, hogyan kell ezt csinálni a C ++? Nos, fogalmam sincs. Azt hiszem, akkor lehet, hogy egy hamis iostream épít printf átviheti gettextet vagy valami más fordítási célra. Természetesen a $ nem egy C szabvány, de ez annyira gyakori, hogy véleményem szerint ez biztonságos a használata.

Nem kell emlékezni / keresni egy különleges egész típusú szintaxist

Nem lehet nyomtatni a byte NULL, \ 0

Mivel printf használja a C vonal helyett vonal C ++, akkor nem tud nyomtatni, anélkül NULL byte-os különleges trükköket. Bizonyos esetekben lehet használni% c „\ 0” érvként, de ez nyilvánvalóan egy hack.

gondolat

Frissítés. Kiderül, iostream olyan lassú, hogy általában lassabb a merevlemez (ha átirányítani a program a fájlt). Szinkronizálás kikapcsolása segítségével stdio is segíthet, ha kell, hogy megjelenjen a nagy mennyiségű adat. Ha a teljesítmény valós probléma (ellentétben az írás egy pár sort, hogy STDOUT), csak használja printf.

Könnyen látható, hogy a két vonal és 2 (számok) vannak elhelyezve, mint a printf érveket. Ez minden; Nincs semmi más. Összehasonlításképpen, ez iostream összeállítani összeszerelés. Nem, nem betét; minden üzemben <

De őszintén szólva, ez nem jelent semmit, mert az I / O a szűk minden esetben. Csak meg akartam mutatni, hogy iostream nem gyorsabb, mert ez egy „biztonságos típus”. A legtöbb implementáció C végrehajtására formátumok printf segítségével számítjuk goto, így printf munkák ugyanolyan gyors, mint ez is, még akkor is, ha a fordító nem tud printf (nem, hogy nem), néhány fordító optimalizálhatja printf bizonyos esetekben - állandó vonal végződő \ n tipikusan optimalizálva van minden kimenet).

öröklés

Nem tudom, hogy miért szeretne örökölni ostream. de nem érdekel. Lehetőség van arra is, hogy a fájlt.

biztonság típusát

Azonban egy változó hosszúságú argumentumlistát nem biztonságos, de ez nem számít, mert a népszerű C fordító képes felismerni a problémákat, a printf. ha tartalmazza a figyelmeztetéseket. Tény, hogy csenget megteheti bevonása nélkül a figyelmeztetések.

A magas szintű körülmények között a fő különbség, hogy milyen típusú biztonsági (cstdio van), a teljesítményt (a legtöbb implementáció iostreams lassabban cstdio) és a bővíthetőség (iostreams lehetővé teszi a testre a kimeneti célok és zökkenőmentesen megjeleníteni bizonyos típusú felhasználó).

Az emberek gyakran azt állítják, hogy a printf sokkal gyorsabb. Ez nagyrészt egy mítosz. Csak teszteltem a következő eredményeket kaptuk:

Következtetés: ha azt akarjuk, csak az új vonal, printf; Ellenkező esetben a cout lesz majdnem olyan gyorsan, vagy még gyorsabban. További információk találhatók a blogomban.

Ahhoz, hogy tiszta, nem próbálom mondani, hogy iostream mindig jobb, mint a printf; Csak azt akarom mondani, hogy meg kell, hogy tájékozott döntést a valós adatokat, nem egy vad találgatás alapján néhány közös, félrevezető feltételezés.

Frissítés: Íme a teljes kódot, amit használni. G ++ összeállított nélkül további lehetőségek (kivéve -lrt szinkronizáláshoz).

Egyikük - egy függvény, amely kiírja a standard kimenetre. Másik célunk, amely számos tagja funkciók és üzemeltető túlterhelés<<которые печатаются в stdout. Есть еще много различий, которые я мог бы перечислить, но я не уверен, что вам нужно.

Számomra az igazi különbség, hogy az lenne menjek «cout» ahelyett «printf»:

1) <<оператор может быть перегружен для моих классов.

3) találom cout olvashatóbb, különösen, ha van egy csomó paramétert.

Az egyik probléma a cout - ez formázási lehetőségek. Formázása adatok (pontosság, tisztesség, és így tovább. D.) A printf könnyebb.

Két pont itt nem említett egyébként, szignifikáns:

1) cout hordoz egy csomó poggyász, ha eddig még nem használta STL. Hozzáteszi kétszerese kódját objektum fájlt, mint a printf. Ez szintén igaz a húr. és ez a fő oka annak, hogy én inkább, hogy saját könyvtárát szálakat.

2) cout használ túlterhelt <<операторы, которые я нахожу неудачными. Это может добавить путаницу, если вы также используете оператор <<по своему назначению (сдвиг влево). Я лично не люблю перегружать операторов для целей, имеющих тангенциальное значение для их предполагаемого использования.

A lényeg: azt fogja használni cout (és string), ha használom az STL. Egyébként, én igyekeznek elkerülni azt.

A primitív, valószínűleg nem számít, melyiket használja. Azt mondják, ha ez hasznos, ha meg kívánja jeleníteni összetett objektumokat.

Például, ha van egy osztály,

Most a fenti nem tűnik túl jó, de tegyük fel, hogy meg kell, hogy megjelenjen több helyen a kódban. Nem csak, hogy mondjuk, hogy felvegye a «int d» mezőben. A cout csak akkor kell változtatni egy helyen. Azonban a printf, meg kell változtatni azt a talán a sok helyen, és nem csak, hogy van, hogy emlékeztesse magát melyikük visszavonására.

Ezzel azt mondta, a cout, akkor csökkentheti sok időt töltött a karbantartását a kódot, nem csak az, hogy ha újra használni egy objektumot a „valami” az új alkalmazás, akkor nem igazán kell aggódni a kimenet.

Azt mondanám, hogy a hiányzó bővíthetőség printf nem teljesen igaz:
A C, ez igaz. De C nincs valódi osztályok.
A C ++, akkor terhelje az elosztási operátor, így túlterhelés üzemeltető char * és a printf alábbiak szerint:

Elképzelhető, ha Foo terhelje jó szolgáltató. Vagy ha készített egy jó módszer. Röviden, a printf azonos nyújtható a cout nekem.

A műszaki érv, hogy látom a témához C ++ (általában nemcsak cout ..):

Írja biztonságát. (És mellesleg, ha akarom nyomtatni egy „\ n”, azt használja a putchar ( „\ n”). Nem fogom használni egy nukleáris bombát, hogy megöli a rovart.).

Könnyebb megtanulni. (Nincs „kemény” paramétereit a vizsgálat, egyszerűen használható kezelő <<и>>)

Bízza std :: string (A printf egy std :: húr :: c_str (). De scanf?)

Látom a printf:

Könnyebb, vagy legalábbis rövidebb (az a karakter írásban) bonyolult formázás. Sokkal könnyebben olvasható, nekem (ízlés kérdése, azt hiszem.)

Jobb ellenőrzés, amelyek a függvény (vagy inkább, hogy hány karakter írtak, és% n jelformáló: «semmit sem nyomtat A argumentum egy mutatót aláírt int, amely megtartja a karakterek száma írt eddig.» (Ebből printf - C ++ referencia)

A legjobb lehetőség, hogy a hibakeresés. Ugyanebből az okból, mint az utolsó érv.

Az én személyes preferencia scanf függvények printf (és scanf), leginkább azért, mert szeretem a rövid vonalak, és mivel én nem hiszem, hogy a fajta nyomtatási problémát, ha a nyomtatás igen nehéz elkerülni. Az egyetlen dolog, elítélem a funkciókat C-style, hogy std :: string nem támogatott. Meg kell átadni char * előtt std :: húr :: c_str () a printf (STD :: húr :: c_str (), ha azt akarjuk olvasni, de hogyan kell írni?)

Más különbségek: «printf» egész értéket ad vissza (ami egyenlő a több nyomtatott betűkkel), és a «cout» vissza semmit

cout <<"y = " <<7; Не является атомарным.

printf ( "% s =.", "y", 7); Ez atomi.

Cout végez típusellenőrzés printf - nincs.

Nem iostream ekvivalens "% d"

Persze, meg lehet írni a „valami” egy kicsit jobban, annak érdekében, hogy fenntartsák szolgáltatás:

Szeretném kiemelni, hogy ha meg akarja játszani a folyamok C ++, ha használja cout lehet kapni néhány érdekes eredményeket.

Tekintsük ezt a kódot:

Most minden kicsoszogott. Azt is eltérő eredményeket adnak, próbálja ki egy párszor:

Használhatja printf a helyes választás, vagy használhatja mutexek.

Ezek nyomtatására használt értékeket. Van egy teljesen más szintaxist. C ++ egyaránt, C csak printf.

Nem vagyok szakértő. Én csak véletlenül meghallja két alkalmazottal beszél, hogyan kell elkerülni a használatát C ++ beágyazott rendszerek miatt teljesítmény miatt. Nos, érdekes módon, csináltam egy tesztet alapján a valódi feladata a projekt.

A fenti probléma, mi volt, hogy írjon néhány konfiguráció RAM. Olyasmi, mint:

kávé = forró
cukor = nincs
Anyatej =
mac = AA: BB: CC: DD: EE: FF

Minden tőlem telhetőt megtettem, hogy csiszolják őket, mielőtt hurkolt mindkettő 100000 alkalommal. Íme az eredmények:

Object Fájl mérete:

Következtetés: Az én nagyon konkrét platform. egy igen konkrét processzor. Úgy működik, nagyon különleges változata a Linux kernel. A program elindításához. amely összeállított egy nagyon speciális változata GCC. érdekében. elvégzésére egy nagyon különleges feladat. Azt mondanám. C ++ megközelítés jobban megfelel. mert működik, sokkal gyorsabban és sokkal jobb olvashatóság érdekében. Másrészt, a C egy kis területen, véleményem szerint, nem jelenti azt, szinte semmi. mert a méret a program nem a mi dolgunk.

Nem vagyok programozó, de én egy mérnök az emberi tényező. Úgy érzem, egy programozási nyelv legyen könnyű megtalálni, megérteni és használni, és ez megköveteli, hogy egy egyszerű és következetes nyelvi szerkezet. Bár minden nyelv szimbolikus, és így eleve önkényes, vannak megállapodások és ragaszkodás hozzájuk teszi a nyelvet könnyebb megtanulni és használni.

Python, mi, természetesen. segítségével kinyomtathatók is elég standard object.method szintaxis, azaz variablename.print, mert a változók tárgyakat, de a C ++, nem azok.

Nem szeretem cout szintaxis miatt <<оператор не следует никаких правил. Это метод или функция, т.е. принимает параметр и делает что-то для него. Однако написано, как если бы это был математический оператор сравнения. Это плохой подход с точки зрения факторов человека.

printf () jelentése az idő függvényében egy változó cout.

Kapcsolódó cikkek