ceckovy kviz

Jan Waclawek konfera na efton.sk
Středa Září 6 08:15:37 CEST 2023


C=D je priradovaci vyraz, ktory jednak priradi hodnotu D do premennej C,
ale co je rozdiel oproti normalnym jazykom, je, ze okrem toho ma aj
navratovu hodnotu, ktorou je ta ista hodnota ktora bola priradena (C99
6.5.16#3).

(To, spolu s ignoraciou potreby diferencovat boolean a integer typy, je aj
dovod, preco je spominane

if (A = B) {}

v C korektny vyraz.)

if (vyraz1, vyraz2) vyuziva tzv. comma operator (C99 6.5.17). To je znova
specialita v C, vyhodnoti sa lavy vyraz, jeho vysledok sa zahodi, potom sa
vyhodnoti pravy vyraz a jeho vysledok je vysledkom celeho vyrazu.

Tu teda
if (C=D, A=B) {};
priradi B do A, zahodi sa vysledok, potom sa priradi D do C a ta ista
hodnota sa vyhodnoti kvoli if() (false = 0, true = cokolvek ine).
Da sa to teda ekvivalentne zapisat aj ako 
A = B;
C = D;
if (C) {};

ale mozu tam byt detaily ktore odovodnuju ten "skrateny" zapis (napr. ze to
je jeden vyraz takze sa da nieco s makrom alebo neda alebo nieco take,
nemam chut nad tym rozmyslat).

Podobne
if (--i, A=B) {};
priradi B do A, zahodi vysledok, dekrementuje i a pouzije vysledok toho
dekrementu na vyhodnotenie kvoli if().

for cyklus je len inak zapisany while cyklus, for (a; b; c) {d;} je to iste
ako 
a; while (b) {d; c;}
len pre cloveka v obvyklych situaciach citatelnejsie. Takze 

for (; i--; ++j, ++k) {xxx;};

je to iste ako 
while(i--), {xxx; ++j, ++k};

Presnu interpretaciu toho i-- necham na domacu ulohu. :-)

----

Co sa tyka historie, pisal som o tom na mikrozone taky serial asi pred 10
rokmi. C nie je evolucne hned po asm, ale mentalne ano. Po asm evolucne
prvy jazyk je FORTRAN, ktory bol optimalizovany kompilovany jazyk. Ak
niekto pozna FORTRAN, tak si mozno odpluje; ale ak sa zamysli nad tym, ze
to bola koniec 50tych rokov ked este operacna pamat bola napriklad
magneticky bubon, tak sa hlboko pokloni az po zem.

Potom vznikli rozne "pragmaticke veci" ako COBOL a BASIC, ale to bolo este
take neriadene. Ale z FORTRANU evolucne vznikol Algol, a to uz bolo nieco,
pretoze na tom pracovali najvacsie mozgy tych cias. Bohuzial, neskor to s
Algolom68 (a PL/1 co je suvisiaca story) prestrelili, z coho reakciou
vznikol Pascal ako zjednodusenie, ktore si ale zachovava klucove dobre
prvky, ktore sa za to desatrocie vykrystalizovali (a goto, co je vtip ku
ktoremu treba vediet pozadie).

C vznikol tiez ako reakcia na PL/1, ale bohuzial nie extrakciou toho
dobreho, ale divokym bastlenim, slovo "hack" je tu plne namieste, tak isto
ako "prenositelny makroasembler PDP-11". Ten i++ (a rovnako ++i, i--, --i)
je nic ine ako inkrement adresy ktory je vedlajsim produktom adresovacich
modov v PDP-11; aj presne s tym poradim pouzitia povodnej hodnoty vs.
inkrementovanej hodnoty (pre-increment, post-increment). Neexistencia
booleanu ako typu je nasledok toho, ze povodne v C (resp. v jeho internej
evolucnej verzii). Atd., proste ako sa to Ritchiemu (a Thomsonovi, pre
ktory to pisal) v tom okamihu hodilo.

Mimochodom, Ritchie za najvacsi vynalez v C pokladal to, ze sa mu podarilo
implementovat mechanizmus imitujuci polia bez toho aby implementoval polia
(nemam chut terz hladat ten clanok, da sa najst ako archivna Ritchieho
stranka v AT&T alebo tak nejak). To vela vysvetluje.

Cize C je taky hnusny zlepenec nesuvisiacich veci. Dost sa to podoba Unixu
no a nie nahodou. Precitajte si Unix Hater's Handbook, vela to objasni,
vratane predslovu od Ritchieho.

[reklama] Ta moja knizka je PRESNE o tomto, PRESNE o tych historickych
suvislostiach a vselijakych hackoch z ktorych sa C sklada. Nie nahodou.
Tiez som bol - a dodnes som - frustrovany a ta knizka je len supis tych
frustracii, nic menej, nic viac. [/reklama]

Ale ano, dokonalost neexistuje; jazyky postavene na pevnych pravidlach
ludia mozu pokladat za obmedzujuce; C je defacto standard s mnozstvom
prekladacov pre vsetky mozne targety, atd.atd.

Svet nie je ciernobiely.

wek



----- Original Message ---------------
Pěkně prosím, můµete ty tři "úsporné" příklady trochu rozvést? Koukám na to 
jak vrána, jsem taky přeučenej pascalista :)

Díky.

Pavel Kutina



----- Original Message ----- 
From: "d.petr" <d.petr na post.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Tuesday, September 5, 2023 8:43 PM
Subject: Re: ceckovy kviz


i++: úsporněj±í zápis neznám, ale i jiné jazyky to pouµívají, určitě třeba 
Perl

Podobná přiřazení občas pouµívám, ačkoliv ne úplně A=B, ale třeba
if ((Vysledek = write (...)))
Ty dvojité závorky potlačí výpis varování pro tento případ.

Ale výjimečně napí±u třeba i něco na způsob
if (C=D, A=B) {};
if (--i, A=B) {};
resp. for (; i--; ++j, ++k) {};
Ale to fakt jen tehdy, kdyµ to nesniµuje čitelnost a přehlednost a kdyµ
jsem 
přesvědčen, µe mi to ani v budoucnu nebude překáµet. :-)

P.


Martin Záruba napsal(a) dne 05. 09. 23 v 14:24:
>...
> Uznávám, µe zápis je velmi úsporný. Například
> i++;
> nenapí±ete asi v µádném jiném jazyku úsporněji. Na druhou stranu.... 
> Pouµili jste někdy někdo zápis
>
> if (A=B) {};
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list 

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list