Usare if come valore

Ciao a tutti
In uno sketch molto complesso vorrei usare un if in questo modo:

A=if(pippo==pluto)+1;

in cui A dovrebbe valere 1 se pippo<>pluto o 2 se sono uguali. E’ corretto?

Grazie.
Gianluca

No, al massimo puoi fare così:

A=(pippo==pluto)+1;

Ma è abbastanza orribile, meglio un if esplicito:

if(pippo==pluto)
A=2;
else
A=1;

if(pippo==pluto) A=2 else A=1

L'operatore ternario serve appunto per creare un'espressione condizionale:

A = (pippo==pluto) ? 2 : 1;

Ah, certo, SukkoPera! Non ci va l’if :slight_smile:

Il problema è che mi semplifica molto le cose. Se tempo è minore di Ti, devo dividere per tempo-1, altrimenti devo dividere per tempo:

dstd=sqrt(cpm/(tempo-(tempo<Ti)));

Purtroppo c’è un bug che non sono riuscito a risolvere, non voglio diventarci matto e così devo considerare tempo oppure tempo-1… >:(

Grazie a tutti!

Per usare si usa, perché ci si affida alla rappresentazione sottostante di true/false, ma è un “trucco”. Se una nuova versione del compilatore variasse la rappresentazione interna, tutti i programmi contenenti “trucchi” cesserebbero di funzionare.

Invece le stesse cose fatte con l’operatore ternario (o con if espliciti), e quindi lavorando con maggiore astrazione, continuerebbero a funzionare regolarmente:

dstd = sqrt(cpm / ((tempo < Ti) ? tempo-1 : tempo));

Claudio_F:
Per usare si usa, perché ci si affida alla rappresentazione sottostante di true/false, ma è un "trucco". Se una nuova versione del compilatore variasse la rappresentazione interna, tutti i programmi contenenti "trucchi" cesserebbero di funzionare.

Esatto ...
... NON perché qui il compilatore assegna 0 al valore falso e 1 al valore vero questa regola è vera ovunque.

In realtà "falso" è 0 ma "vero" è qualsiasi valore diverso da 0 (... ed alcuni compilatori usano 0xff) ... ::slight_smile:

Guglielmo

Anch'io ero convinto di questo, ma in realtà c'è la sottigliezza che quando il compilatore deve convertire un valore booleano in intero, il risultato è garantito essere sempre 0 o 1:

If the source type is bool, the value false is converted to zero and the value true is converted to one.

Qua maggiori informazioni: http://stackoverflow.com/questions/5369770/bool-to-int-conversion

Interessante ... :slight_smile:

Guglielmo

Claudio_F:

dstd = sqrt(cpm / ((tempo < Ti) ? tempo-1 : tempo));

Voto per l’operatore ternario.
Già l’operatore ternario non è facilissimo da leggere ma l’altro è illeggibile.
Anche così funzia: dstd = sqrt(cpm / (tempo-(tempo < Ti)?1:0));

Sarà questione di sensibilità personale... a me sembra più facile da leggere nell'altro modo :slight_smile:

paulus1969:
Sarà questione di sensibilità personale... a me sembra più facile da leggere nell'altro modo :slight_smile:

Intendi così ? A=(pippo==pluto)+1;
A me pare che, soprattutto per un non esperto di C, avere = e == su stessa riga, confonde.

Io adoro cose come

a = b * (c > d) + e * (c <= d) + f * (g == h)

forse a molti una cosa del genere sembrerà orrenda :slight_smile:

Orrenda no. Solo complicatina da capire dopo qualche mese che rivedi il codice :slight_smile:

Per questo dico che è soggettivo... a me sembra chiarissima.