Punto interrogativo nel codice

Buonasera a tutti, sono alle prese di un codice relativo ad un telecomando per modellini di aerei.
In sostanza lo vorrei modificare per adattarlo alle mie esigenze. Ma una parte di esso non mi è comprensibile.
E’ quella dove appare un punto interrogativo l’ultima riga.
Mi potreste delucidare in merito ?

// Joystick center and its borders

int mapJoystickValues(int val, int lower, int middle, int upper, bool reverse)
{
val = constrain(val, lower, upper);
if ( val < middle )
val = map(val, lower, middle, 0, 128);
else
val = map(val, middle, upper, 128, 255);
return ( reverse ? 255 - val : val );
}

E' una schifezza che qualcuno ritiente essere più compatta di un normale IF ... perché, a tutti gli effetti, è un IF. Certo è più compatto, ma è anche molto meno leggibile ... ::slight_smile:

Si chiama operatore ternario il primo elemento è la condizione, poi, con il '?', cosa fare se TRUE e poi, con il ':', cosa fare se FALSE ...

( condizione ? cosa_fare_true : cosa_fare_false )

In pratica, viene valutato il booleano "reverse", se è vero, si prende il valore 255 - val, se falso, si prende il valore val ...

if ( reverse ) return ( 255 - val );
else           return val;

Guglielmo

si chiama operatore ternario

giusta regola sarebbe aggettivo, non sostantivo, ma siccome è l'unico operatore ternario del 'C' vale come sostantivo

nel tuo caso:
se reverse fosse vero varrebbe 255-val
se invece reverse fosse falso varrebbe val

ovvero: posto

a ? b : c

con a , b e c delle espressioni (non necessariamente direttamente numeri)

varrebbe b se a fosse vero, altrimenti c

trovi molti esempi in giro, e sui libri di testo

viene usato poco, proprio perché poco leggibile

si preferisce usare il costrutto

if()
{...}
else
{...}

però questo è un costrutto, l'altro è un operatore, ci sono alcune differenze concettuali

non è vero che è una schifezza, solo che viene usato a sproposito

ti permette di avere solo UN operatore invece di un costrutto if()

prova ad avere poca memoria e magari righe di printf() molto lunghe e poi ne parliamo, eviti branch e variabili di appoggio

però va usato quando serve, non a pioggia...

e aggiungo: come molte cose del C va valutato nell'ottica del suo tempo:

ai tempi si andava sulla luna con meno trasnistor di quelli che servono adesso per il telecomando dell'auto
e la differenza tra un if..else e un operatore si sentiva
e poi il tempo cambia molte cose, e ne cambia anche la loro valutazione
ad esempio il break; obbligatorio nei case dello switch, che anche K&R hanno capito essere discutibile
le struct che non definiscono direttamente un tipo, come in C++, ci si domanda: Ma non ci hanno pensato?
ai tempi magari era un minirispamio abbastanza importante

e poi magari allora, sul PDP7, esisteva una istruzione macchina corrispondente esattamente all'operatore ternario

Capito ! grazie della veloce risposta.
Buona serata a tutti.

Standardoil:
non è vero che è una schifezza, solo che viene usato a sproposito

... mah ... continuo a pensare che sia una schifezza e, negli ambienti "seri", è anche cosa deprecata! ::slight_smile:

Dalla IBM Rational (punti con l'iniziale 'E', estensione delle MISRA) ...

E12.51- Ternary expression ?: should not be used.

L'ho sempre trovato molto poco leggibile e facile causa di errori ... però, certo, esiste e tocca saperlo ... :wink:

Guglielmo

return (reverse? 255-val : val);

Mah... Non sono abituato a usarlo. A meno, però, che vengano inserite lunghe espressioni come valori, con gli spazi ben distribuiti lo trovo ben leggibile.

gpb01 in un forum avevo postato un piccolo codice per arduino, un ingegnere elettronico aveva dubbi sul codice perché avevo usato un if else per valutare una variabile, e secondo lui fatto bene significava usare l'operatore ternario.

In realtà penso siano equivalenti, se conosci l'operatore capisci il codice, ma dopo la compilazione credo non esista differenza tra un if else e operatore ternario, il codice macchina sara identico.

torn24:
In realtà penso siano equivalenti, se conosci l'operatore capisci il codice, ma dopo la compilazione credo non esista differenza tra un if else e operatore ternario, il codice macchina sara identico.

Assolutamnete SI :slight_smile: ... il compilatore è sufficientemente intelligente da ottimizzarli entrambi allo stesso modo.

Ripeto però, in ambienti dove ci sono norme stringenti, NON si usa (Vd. mio post #5).

Guglielmo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.