<html><head><title>Re: Chyba v C - velmi podivné chování</title>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 10pt;">Myslím že lepší otázka zní, jak to napsat tak aby bylo na první pohled jasné co daný výraz vyhodnocuje, <br>
bez ohledu na počet písmenek.<br>
<br>
Abych planě nekritizoval, nejspíš bych to udělal takhle, ale protože nevím účel celé konstrukce,<br>
tak by bylo třeba lepší zahrnout i porovnání s trijkou. Podmínku malého počtu písmenek zcela zjevně <br>
nesplňuju, ale to zcela záměrně, protže bych se v tom rád vyznal i po několika letech kdy jsem to neviděl.<br>
<br>
<br>
#define   MIN_A_COUNT               2            // vyznam teto konstanty<br>
#define   REMAING_COUNT       12        // vyznam teto konstanty<br>
#define   MINIMAL_COND_COUNT   3        // vyznam teto konstanty<br>
 <br>
static inline int count_test_conditions(int a, int b, int x, int y) <br>
{<br>
    int count = 0;<br>
    if (a < MIN_A_COUNT) {++count;}        // oduvodneni teto podminky<br>
    if (a > b) {++count;}                  // oduvodneni teto podminky<br>
    if (x < y) {++count;}                  // oduvodneni teto podminky<br>
    if ((a%x) == REMAING_COUNT) {++count;} // oduvodneni teto podminky<br>
    if (b < y) {++count;}                  // oduvodneni teto podminky<br>
    return count;<br>
}<br>
<br>
if (count_test_conditions(a, b, x, y) > 3) {<br>
}<br>
<br>
<br>
A bylo by docela zajímavé se podívat jak se liší zkompilovaný kód v obou případech.<br>
Myslím že by tam velké rozdíly nebyly.<br>
<br>
Tomáš<br>
<br>
<br>
</span><table>
<tr>
<td width=2 bgcolor= #0000ff><br>
</td>
<td width=1025><span style=" font-family:'calibri'; font-size: 11pt;">Otázka tedy zní, jak ho upravit, aby prošel a přibylo co nejméně písmenek:-)<br>
 <br>
PH<br>
 <br>
<b>Od: </b></span><a style=" font-family:'calibri'; font-size: 11pt;" href="mailto:as5sgm@gmail.com">as5sgm@gmail.com</a><br>
<span style=" font-family:'courier new'; font-size: 10pt;">>>> If ((a<2)+(a>b)+(x<y)+(a%x==12)+(b<y) > 3) {<br>
Tento riadok kodu by nepresiel review a ani MISRA rules, vsade kde su aspon dvaja vyvojari :)<br>
Miro<br>
 <br>
<span style=" font-family:'calibri'; font-size: 11pt;">On 21. 4. 2020 10:37, Pavel Hudecek wrote:<br>
Vzhledem ke komutativnosti sčítání by pořadí mělo bejt irelevantní, kromě toho posledního >, ale to má nižší prioritu než +, takže se musí vyhodnotit jako poslední.<br>
 <br>
No a že to nebude fungovat v jiných jazycích? To je snad normální. Nebo všechny mají ++, printf, pointery jako Delphi, nepotřebují deklarovat proměnné jako VB6, … ?<br>
 <br>
Příkazů je tam 0, takže omezení na max. jeden na řádek to taky nepřekračuje.<br>
 <br>
PH<br>
 <br>
<b>Od: </b></span></span><a style=" font-family:'calibri'; font-size: 11pt;" href="mailto:a2x1nptda8@email.cz">Michal Gregor</a><br>
<span style=" font-family:'calibri'; font-size: 11pt;">Spravne se maji slozite podminky prevest do funkci. Plati zasada jeden <br>
radek jeden prikaz. A nespolehat se na interni "tajne" funkce <br>
compilatoru. Co kdyz to nekdo skopiruje do C++? Nebo do uplne jineho jazyja.<br>
 <br>
 <br>
Dne 21.04.2020 v 8:46 Jan Waclawek napsal(a):<br>
> A nemohlo to byt skor o tom, ze v takychto vyrazoch<br>
> <br>
>>> If ((a<2)+(a>b)+(x<y)+(a%x==12)+(b<y) > 3) {<br>
> <br>
> nie je zarucene poradie vyhodnotenia pod-vyrazov, aj keby mali vedlajsie<br>
> efekty?<br>
> <br>
> wek<br>
> <br>
> <br>
> ----- Original Message ---------------<br>
>> Sa vam dvom do toho zamontujem, som nieco nasiel vo svojom archive, ale<br>
>> Ty si mimo podozreni :)<br>
>> Skor si ja pofajcim, ze uz kedy som daval do placu citat z normy, ktory<br>
>> si teraz dal aj Ty :-D<br>
>> <br>
>> </span><a style=" font-family:'calibri'; font-size: 11pt;" href="https://list.hw.cz/pipermail/hw-list/2011-July/399004.html">https://list.hw.cz/pipermail/hw-list/2011-July/399004.html</a><br>
<span style=" font-family:'calibri'; font-size: 11pt;">>> <br>
>> miro<br>
>> <br>
>> On 21.4.2020 1:17, Jan Waclawek wrote:<br>
>>> Hm, tak ja vidim vyhody skor v tych 6 ifoch a 1 pomocnej premennej...<br>
>>> <br>
>>> Ale ak by si nahodou nasiel odkaz, kde ten JW z minulosti povedal, ze<br>
>>> vysledkom podmienky nemusi byt 0 alebo 1, tak by som Ti bol vdacny.<br>
>>> <br>
>>> wek<br>
>>> <br>
>>> <br>
>>> ----- Original Message ---------------<br>
>>> Tak?e se po pár misících mu?u vrátit k tomu, ?e jedna z výhod C je mo?nost<br>
>>> dilat vici, jako:<br>
>>> <br>
>>> If ((a<2)+(a>b)+(x<y)+(a%x==12)+(b<y)>  3) {<br>
>>> <br>
>>> Co? v jiných jazycích vede na 6 ifu a 1 pomocnou prominnou.<br>
>>> <br>
>>> PH<br>
>>> <br>
>>> Od: Jan Waclawek<br>
>>> <br>
>>> Hm, tak potom by som mal asi tomu JW z minulosti jednu tresnut...<br>
>>> <br>
>>> Konkretne teda, C99, 6.5.8 Relational operators #6:<br>
>>> Each of the operators<  (less than),>  (greater than),<= (less than or<br>
>>> equal to), and>=<br>
>>> (greater than or equal to) shall yield 1 if the specified relation is true<br>
>>> and 0 if it is false. 92)<br>
>>> The result has type int.<br>
>>> <br>
>>> Ten footnote 92) je kuzelny:<br>
>>>    The expression a<b<c is not interpreted as in ordinary mathematics. As the<br>
>>> syntax indicates, it<br>
>>> means (a<b)<c; in other words, ??if a is less than b, compare 1 to c;<br>
>>> otherwise, compare 0 to c??.<br>
>>> <br>
>>> wek<br>
>>> <br>
>>> <br>
>>> ----- Original Message ---------------<br>
>>> <br>
>>> Mil jsem nijak za to, ?e to byl právi jistý JW, kdo mi tu onehdá vyeetl, ?e<br>
>>> spoléhat se, ?e výsledkem podmínky je 0 nebo 1 není správné:-)<br>
>>> <br>
>>> PH<br>
>>> <br>
>>> Od: Jan Waclawek<br>
>>> <br>
>>>> A jinak teda ten kód udilá to, ?e pokud je splnina podmínka v závorce, nastaví se bit 0 na výstupní (zda to bude bit 0 není zarueeno, ale jinak skoro jisté).<br>
>>> <br>
>>> Preco by to nemal byt bit 0?<br>
>>> <br>
>>> _______________________________________________<br>
>>> <br>
>>>>> <br>
>>>>>     DDRB |=(1<CLK_UP); <br>
<span style=" font-family:'courier new'; font-size: 10pt;"> </td>
</tr>
</table>
</body></html>