quanti and posso fare in una unica chiamata if

buona sera vorrei porre un quesito che magari può sembrare banale ma mi assilla.
quanti and si possono mettere in una chiamata if?

esempio if (a==1 && b==0 && c>=1 etcc

credo che l'unico limite sia la leggibilità del codice...

Esatto.

In realtà ci sono dei limiti imposti anche dal compilatore ...
... secondo lo standard C11, la lunghezza massima è almeno di 4095 caratteri, ma gcc dovrebbe accettare di più, credo sino al limite dei 64K.

Sono comunque limiti teorici ... dato che, come detto sopra, oltre un certo limiti il codice diventa illegibile !

Guglielmo

"lunghezza massima" é inteso la singola riga fino al newline.
Ciao Uwe

uwefed:
"lunghezza massima" é inteso la singola riga fino al newline.

Non esattamente, potresti benissimo scrivere su più righe (quindi avere più new-line) ed essere sempre all'interno della stessa "riga di codice" :wink:

Guglielmo

gpb01:
potresti benissimo scrivere su più righe (quindi avere più new-line) ed essere sempre all'interno della stessa "riga di codice" :wink:

Guglielmo

mi intrometto... come è possibile fare quest'ultima tua affermazione?
con VB si andava con &_ se non ricordo male...

In C in generale non serve fare niente di particolare, basta andare semplicemente a capo. Per il compilatore, spazi, tab e "a capo" sono tutti la stessa cosa, ovvero whitespace. Nei rari casi in cui questo non basta (all'interno di una stringa, per esempio), si deve terminare la riga con il classico backslash ''.

Quanti millisecondi impiega la CPU a fare un confronto if?

comtel:
Quanti millisecondi impiega la CPU a fare un confronto if?

Non è che questa tua domanda abbia molto senso ::slight_smile: ... ad esempio, dipende da quanto è complesso l'IF.

Possiamo invece dire che quasi tutte le istruzioni assembler del ATmega328P vengono eseguite in 1 ciclo macchina. Considera però che NON basta considera la singola operazione di "compare", c'è il caricamento dei registri con gli operandi, il compare, la decisione, ...

La cosa più semplice e che ti guardi il codice assembler generato da TUO codice e verifichi le varie operazioni il tempo che impiegano.

Guglielmo

Grazie Guglielmo

Dicciamo che un if viene controllato da sinistra a destra e interrotto in questo caso alla prima espressione non vera perché con i and tutti i controlli devono essere veri.
Puoi velocizzare un if con tutti AND scrivendo alla sinistra il controllo piú improbabile che sia vero. Cosi nella maggior parte dei casi fa un unico controllo e salta subito al else se presente oppure alle funzioni dopo il if.
Analogamente coi or. Alla sinistra quello piú probabile vero e cosí salta spesso i restanti controlli.

Ciao Uwe

domanda.
per fare un raffronto si può scrivere ad esempio:

if(5>a<10){ .....
etc..
mi pare che in altri linguaggi si possa fare o sbaglio?

NO, in 'C' NON è permesso. Devi fare le due comparazioni separatamente ed unirle con un AND logico (&&).

Guglielmo

P.S.: Ma comprare un buon libro di 'C' e studiarlo no ? ? ? :smiling_imp: ... t'assicuro che semplifica le cose :wink:

si lo farò sicuramente anzi qualche anno fa l'avevo già acquistato e letto ma la memoria fa cilecca ...

Quando c'è la necessità di molte AND o altri operatori logici nelle if il codice diventa un incubo sia da scrivere che modificare. Per fortuna con il C (ma penso anche con altri linguaggi ciò sia possibile), in particolare si usa una struttura dati di n elementi. Ogni elemento viene impiegato per accendere uno o più bit, ciò ci permette di impiegare il costrutto switch case. La realizzazione e semplice quando si opera su una sola variabile di dimensioni opportune, mentre con le strutture dati in cui ogni elemento è una variabile le cose si possono complicare specie se l'applicazione richiede l'annidamento di molti switch case.

In alcuni casi estremi o può tornare utile conoscere il funzionamento della MCU e dei suoi registri e allora si prende spunto da ciò, e quindi si creano n registri, sempre gestiti bit per bit. Ma gira o rigira o si finisce per usare a sproposito switch case oppure nel tentativo di semplificare si sostituiscono con delle lookup table.

Io cerco sempre una soluzione alternativa quando gli AND (o altro) superano le 4 righe, le tollero se nel codice completo c'è solo una if di questa per ogni modulo C (con arduino style il concetto di modulo C svanisce).

Quindi se si tratta di una sola if, anche di 10 righe, la mandi giù, anche perché trovare un'alternativa potrebbe portare via molto tempo.

Ciao.