Go Down

Topic: Che significa if(a, b) ? (Read 236 times) previous topic - next topic

Claudio_FF

Vedo che il compilatore non fa una piega se si scrive:
Code: [Select]
if (a, b) { ... }
Credevo fosse sintatticamente errato, invece apparentemente l'if viene eseguito se 'b' è true indipendentemente da 'a'.

* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

gpb01

#1
Jul 20, 2019, 09:33 am Last Edit: Jul 20, 2019, 09:36 am by gpb01
Cerca su google "C comma operator" (operatore virgola) ... la virgola, difatti, in 'C' fa anche da operatore binario e ... i risultati non sono quelli che immagini :D :D :D

Guglielmo

P.S.: in pratica, i vari elemanti da sinistra a destra vengono solo valutati e solo l'ultimo viene poi realmente utilizzato. ;)
Search is Your friend ... or I am Your enemy !

Claudio_FF

Ah, a sapere cosa cercare :)

Da: https://en.wikipedia.org/wiki/Comma_operator
«The comma operator has relatively limited use cases. Because it discards its first operand, it is generally only useful where the first operand has desirable side effects that must be sequenced before the second operand.»

Programmazione tramite side effect, al confronto l'operatore ternario è un orsacchiotto di peluche.
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

gpb01

#3
Jul 20, 2019, 10:03 am Last Edit: Jul 20, 2019, 10:04 am by gpb01
Programmazione tramite side effect, al confronto l'operatore ternario è un orsacchiotto di peluche.


... difatti, credo di non averlo mai incontrato in tanti anni e bisogna, oltretutto, stare attenti a non confonderlo con la virgola usata invece come 'separatore' (es. nella dichiarazione di più variabili dello stesso tipo).

Indubbiamente, se l'operatore ternario è sconsigliato/non tollerato, quello virgola lo è ancora di più dato che confonde veramente le idee e NON c'è alcun motivo di farlo (tanto alla fine è sempre il compilatore che ottimizza).

Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

Sintassi corretta ma anche nel mio caso direi veramente pessima perché fa confondere, e mai usata né mai vista usare.

Per dire, questo:

Code: [Select]
  int a = 0, b = 1;
  Serial.println(a);
  if ( a=1, b>0)
    Serial.println("b maggiore di zero");
  Serial.println(a);


produce questo output:

Code: [Select]
0
b maggiore di zero
1

ed equivale quindi a:

Code: [Select]
  int a = 0, b = 1;
  Serial.println(a);
  a=1;
  if (b>0)
    Serial.println("b maggiore di zero");
  Serial.println(a);
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Federico66


Incuriosito, ho fatto qualche ricerca, e pare che operatore virgola sia utilizzato più che altro nei cicli for, in quanto permette di "separare più istruzioni dove ne è richiesta una soltanto" (cit.), quindi il codice può essere molto compatto.
Ho trovato questo esempio:
Code: [Select]

for(n=1, fatt=1, exp=1 ; n<=5 ; fatt *= n, exp *= 2, n++);

//=>fatt = 120 (=5!)
//=>n = 32 (=2^5)


Sembra che "Questo codice può anche essere più efficiente della controparte con la manipolazione di interna al corpo, perchè molti compilatori ottimizzano parecchio i cicli." (cit.)

Onestamente io ho fatto molta fatica a leggerlo :(

Federico



maubarzi

che sia ereditato dal Perl?
Linguaggio estremamente potente per chi vuole creare codice altamente criptico ;)
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Federico66

che sia ereditato dal Perl?
Linguaggio estremamente potente per chi vuole creare codice altamente criptico ;)
Le mie reminiscenza di perl sono troppo lontane, ma ...

"L'operatore virgola: Potrebbe sembrare l'ennesima diavoleria del Perl, e invece è solo un'eredità del C/C++: l'operatore virgola consente di concatenare due espressioni in un'unica espressione." (cit.)

:) :) :) :)

Federico


gpb01

Dal Kernighan & Ritchie, cap. 3 della seconda edizione in Inglese ...

Quote
One final C operator is the comma ``,'', which most often finds use in the for statement. A pair of expressions separated by a comma is evaluated left to right, and the type and value of the result are the type and value of the right operand. Thus in a for statement, it is possible to place multiple expressions in the various parts, for example to process two indices in parallel.
Ed ancora ...

Quote
The commas that separate function arguments, variables in declarations, etc., are not comma operators, and do not guarantee left to right evaluation.

Comma operators should be used sparingly. The most suitable uses are for constructs strongly related to each other, as in the for loop in reverse, and in macros where a multistep computation has to be a single expression.
Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

che sia ereditato dal Perl?
Linguaggio estremamente potente per chi vuole creare codice altamente criptico ;)
Lo dici perché non hai fatto programmi in LISP o ProLog...
;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up