Che significa if(a, b) ?

Vedo che il compilatore non fa una piega se si scrive:

if (a, b) { ... }

Credevo fosse sintatticamente errato, invece apparentemente l'if viene eseguito se 'b' è true indipendentemente da 'a'.

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 :smiley: :smiley: :smiley:

Guglielmo

P.S.: in pratica, i vari elemanti da sinistra a destra vengono solo valutati e solo l'ultimo viene poi realmente utilizzato. :wink:

Ah, a sapere cosa cercare :slight_smile:

Da: Comma operator - Wikipedia
«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.

Claudio_FF:
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

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

Per dire, questo:

  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:

0
b maggiore di zero
1

ed equivale quindi a:

  int a = 0, b = 1;
  Serial.println(a);
  a=1;
  if (b>0)
    Serial.println("b maggiore di zero");
  Serial.println(a);

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:

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 :frowning:

Federico

che sia ereditato dal Perl?
Linguaggio estremamente potente per chi vuole creare codice altamente criptico :wink:

maubarzi:
che sia ereditato dal Perl?
Linguaggio estremamente potente per chi vuole creare codice altamente criptico :wink:

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.)

:slight_smile: :slight_smile: :slight_smile: :slight_smile:

Federico

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

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 ...

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

maubarzi:
che sia ereditato dal Perl?
Linguaggio estremamente potente per chi vuole creare codice altamente criptico :wink:

Lo dici perché non hai fatto programmi in LISP o ProLog...
:wink: