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