ceckovy kviz 2 (hardcore)

Miroslav Šinko sinkomiro na gmail.com
Středa Září 6 18:56:41 CEST 2023


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


Další informace o konferenci Hw-list