Ordine di precedenza operatori congiunti a puntatori

di il
2 risposte

Ordine di precedenza operatori congiunti a puntatori

Salve,
Qualcuno può chiarirmi un dubbio?
La differenza tra while(*s++) e while (*++s) e while(*s) s++; qual è? In ordine di precedenza quando il compilatore incontra queste righe, cosa esegue? Fa prima l'incremento, poi valuta l'espressione e solo in seguito esegue il corpo del ciclo?? Oppure valuta l'espressione, contemporaneamente(??!) fa l'incremento e poi esegue il corpo?

E cosa accade qui? L'incremento avviene prima dell'assegnamento? Il valore finale di t sarà?
char*f(char*t){
	for(int i=0; i<6; i++)
		*t++ = "mondo"[i];
	return t-6;
}

2 Risposte

  • Re: Ordine di precedenza operatori congiunti a puntatori

    Quando mi vengono dubbi di questo tipo, in genere metto su un programmino di verifica, e "sperimento". Questo anche perché non sempre le spiegazioni che vengono date sui libri e sui manuali sono chiare. A volte danno l'impressione di non essere neppure univoche...
  • Re: Ordine di precedenza operatori congiunti a puntatori

    Devi considerare sia la precedenza che l'associatività, in base a questa tabella: http://en.cppreference.com/w/c/language/operator_precedence.
    Quindi nel caso di while(*s++), il puntatore viene incrementato e poi deferenziato, in while(*++s) gli operatori hanno la stessa precedenza ma l'associatività da destra a sinistra impone che anche in questo caso si faccia prima l'incremento e poi la dereferenzazione (per fare l'opposto dovresti scrivere while(++*s)). In while (*s) s++; credo che l'ordine sia ovvio.

    L'ultimo caso non sono neanche sicuro che sia compilabile (sicuramente non lo è con compilatori C++), perché penso che l'operando di sinistra debba essere un lvalue.
Devi accedere o registrarti per scrivere nel forum
2 risposte