ceckovy kviz 2 (hardcore)
Jindroush
jindroush na seznam.cz
Středa Září 6 19:03:50 CEST 2023
Jojo, tohle me opravdu potesilo koncentrakovanosti zla ;-)
Tady je totiz hlavni problem v tom, ze nevim, jak vy ostatni, ale ja
vnimam ten kod linearne shora dolu. Jenze kompilator ho prelozi uplne
jinak a pak to dava smysl.
Tj. if ma bloky 'pred else' a 'po else' jako dva naprosto oddelene,
koncici 'zdanlivym/realnym' skokem na prvni radek za else. Tj if(neco)
nikdy 'nedojde k else'.
Tak stejne jsou podminky switche vyhodnoceny uz v miste switche a ne az
tam, kde je zapsano case.
No fuj. Snad by to nikdo nenapsal rucne, ale dovedu si predstavit nejak
debilne rozvinute makro... to musi byt radost hledat.
J.
On 06.09.2023 18:56, Miroslav Šinko wrote:
> Toto teda je hardcore... upravene a odkrokovane, aby som to pochopil:
>
> void zhovadilost(int x)
> {
> int input=x;
>
> switch (x)
> default :
> if (x)
> case 2: case 3: case 5: case 7:
> x = 10;
> else
> case 4: case 6: case 8: case 10:
> x = 20;
>
> printf("input=%d, output=%d\n", input, x);
> }
>
> int main(int argc, char* argv[])
> {
> for(int x = 0; x <= 11; x++)
> zhovadilost(x);
> }
>
> input=0, output=20
> input=1, output=10
> input=2, output=10
> input=3, output=10
> input=4, output=20
> input=5, output=10
> input=6, output=20
> input=7, output=10
> input=8, output=20
> input=9, output=10
> input=10, output=20
> input=11, output=10
>
> Pre hodnoty x, ktore maju case, skoci rovno do case. V pripade, ze
> case je v bloku if, else sa obskoci.
>
> Pre ostatne x ide cez default, vyhodnocuje sa if a podla toho sa
> vykona blok za if (nenulove hodnoty), alebo za else (len pre 0).
>
> Ako pisal Andrej, asi je lepsie venovat sa niecomu uzitocnemu, napr.
> ako v C pisat bezpecny kod. Ano, uznavam, ze treba najprv poznat
> nebezpecne konstrukcie.
>
> Ale tiez je dobre ucit sa pisat aj prehladny kod a posledne priklady
> urcite prehladne nie su a ani by ma nenapadlo take nieco napisat :)
>
> miro
>
> On 06.09.2023 18:33, Jan Waclawek wrote:
>> Asi ano, ten moj argument bol dost nasilu. Na druhej strane to goto je
>> skutocne svinstvo; ja s Dijkstrom do pismenka suhlasim (a nesuhlasim s
>> Wirthovym premenovanim toho clanku).
>>
>> Na druhej strane... C ma niekolko sposobov goto, jeden z nich je tzv.
>> computed goto znamejsie pod nazvom switch/case :-) (a break je dalsia
>> forma goto, dalej continue a return - zvykne sa hovorit "disrupted flow"
>> alebo take nieco). Ten if sa da urobit aj s tym switchom, teraz
>> citujem z
>> Dereka Jonesa (tiez taky zdroj perverznosti):
>>
>> switch (x)
>> default : if (prime(x))
>> case 2: case 3: case 5: case 7:
>> process_prime(x);
>> else
>> case 4: case 6: case 8: case 10:
>> process_composite(x);
>>
>> A hned za tym je spomenty Duff's Device, samozrejme.
>>
>> (Mimochodom, vsimni si, ze tam nie su svorkove zatvorky. Derek Jones to
>> uvadza kvoli tomu, lebo toto je z pohladu switch len jediny prikaz,
>> prave
>> ten if; a ze case moze byt kdekolvek v ramci toho prikazu a stale to
>> patri
>> k tomu switch(x). Akurat ze to je neobvykle, obvykle je mat zlozeny
>> prikaz/blok t.j. tie svorkove zatvorky. Tuto je to prepisane do
>> prelozitelneho kuska, ak by si si to chcel vyskusat:
>> volatile int x;
>>
>> int main(void) {
>>
>>
>> switch (x)
>> default : if (x)
>> case 2: case 3: case 5: case 7:
>> x = 10;
>> else
>> case 4: case 6: case 8: case 10:
>> x = 20;
>>
>> }
>>
>> )
>>
>> On ten pokyn nevyhodnocovat else v tej norme asi nie je nahodou.
>>
>> wek
>>
>>
>> ----- Original Message ---------------
>>
>>> Este mi napadlo, ze keby sa else malo vyhodnocovat aj v pripade goto do
>>> bloku if, viedlo by to k nezelanym nasledkom. Upravim Tvoj priklad:
>>>
>>> volatile int k;
>>> volatile int pin2=0; //a nebodaj by bola pin2 neinicializovana :)
>>>
>>> if (InputPin1()) goto pin1_active;
>>> pin2=InputPin2();
>>> if (pin2) {
>>> pin1_active:
>>> k = 10;
>>> } else {
>>> k = 20;
>>> }
>>>
>>> Skutocna hodnota pinu 2 by sa ignorovala.
>>>
>>> miro
>>>
>>> On 06.09.2023 17:50, Miroslav ©inko wrote:
>>>> On 06.09.2023 17:39, Jan Waclawek wrote:
>>>>> Norme je fuk, ako sa zvyknu pisat prekladace.
>>>>
>>>> Jasne, ze prekladace maju byt napisane podla normy a nie naopak.
>>>>
>>>> Napisal som, ako prekladaju if-else. No a Ty si v norme dohladal, ze
>>>> prekladaju spravne :)
>>>>
>>>> miro
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
--
Jindroush <jindroush na seznam.cz>
Další informace o konferenci Hw-list