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