Undefined behaviour

di il
6 risposte

Undefined behaviour

O forse no

Ho un dubbio che forse potete aiutarmi a risolvere


Oggi in mensa con un collega si pensava (e basta, no pc in ditta) ad accorciare una stringa, tipicamente durante un dedupe

Posto di essere arrivati al carattere da togliere (puntato dal puntatore 'h', si pensava una cosa del genere:

while (*h)
   {
   *h=*h+1;
   h++;
   }
Che scorre la stringa e riporta indietro un carattere

Poi abbiamo pensato di compattare:

while(*h=*h+1)
   {
   h++;
   }
E fin qui nessuno dubbio...

Adesso viene il bello:

while(*h=*h++),
Il dubbio:
Non sappiamo se questo porta oppure no ad un undefined behaviour

Perché secondo me no

Secondo il mio collega sì

Lui dice che non si può modificare lo stesso oggetto due volte nella stessa espressione

Io dico che si modificano DUE oggetti: il puntato E il puntatore...

Senza PC non possiamo provare....

Ecco quindi che chiediamo aiuto


Per essere molto chiari:
La cosa è importantissima, c'è di mezzo un caffè da pagare...

6 Risposte

  • Re: Undefined behaviour

    Forse è meglio usare due puntatori per ottimizzare
    
    #include<stdio.h>
    #include<stdlib.h>
    int main(){
        char parola[] = "aabcdefffgghiiii";
        printf("%s\n", parola);
        char *p = parola, *q = parola;    
        while(*q = *p++)
            if(*q != *p)
                q++;    
        printf("%s\n", parola);    
        return 0;
    }
    
    Riguardo il tuo problema: non si è capito bene la riga incriminata. Forse ti manca qualche parentesi, tipo *(h+1)
  • Re: Undefined behaviour

    StandardOil ha scritto:


    si pensava una cosa del genere:
    while (*h)
       {
       *h=*h+1;
       h++;
       }
    In questo modo, partendo da h, vai a sostituire ogni carattere con quello successivo nell' "alfabeto" e non con quello successivo nella stringa. Occhio alla precedenza fra gli operatori!

    StandardOil ha scritto:


    Adesso viene il bello:
    while(*h=*h++),
    Il dubbio:
    Non sappiamo se questo porta oppure no ad un undefined behaviour
    https://stackoverflow.com/questions/8295205/c-function-evaluation-order-in-assignment-operator
  • Re: Undefined behaviour

    Weierstrass ha scritto:



    Riguardo il tuo problema: non si è capito bene la riga incriminata. Forse ti manca qualche parentesi, tipo *(h+1)
    Giusto,

    In effetti lo abbiamo scritto al volo dal furbofono, davanti alla macchinetta del caffè

    Per la cronaca mi sono dato per vinto e il caffè lo ho pagato io
  • Re: Undefined behaviour

    Dai che adesso ci scappa la colazione:

    L'operatore * e l'operatore ++ hanno la stessa precedenza, ma anche la stessa associatività : da destra a sinistra

    Quindi
    *h++
    Equivale esattamente a
    *(h++)

    Come pensavo io

    Dai chi oggi mangio cornetto alla crema....

    Sempre se vinco la scommessa col mio collega..
  • Re: Undefined behaviour

    StandardOil ha scritto:


    L'operatore * e l'operatore ++ hanno la stessa precedenza, ma anche la stessa associatività : da destra a sinistra

    Quindi
    *h++
    Equivale esattamente a
    *(h++)
    Il risultato non cambia, ma in realtà l'incremento suffisso ha una precedenza maggiore rispetto all'operatore di dereferenziazione e un'associatività inversa.

    StandardOil ha scritto:


    Come pensavo io

    Dai chi oggi mangio cornetto alla crema....

    Sempre se vinco la scommessa col mio collega..
    Non so se lo tu lo abbia fatto di proposito o meno, ma hai completamente ignorato il mio precedente post!
    In ogni caso dal link che avevo riportato si evince che l'ordine di valutazione degli operandi dell'operatore di assegnazione = è "non specificato". Ciò significa che nel caso in cui venga valutato prima il secondo operatore, ossia *h++, finirai per assegnare il carattere puntato inizialmente da h a tutti gli elementi successivi della stringa e poiché la condizione risulterà sempre vera andrai anche a scrivere in zone di memoria che non competono all'array provocando infine un crash del programma.
  • Re: Undefined behaviour

    Vabbe

    Mi sono dato per vinto di nuovo

    Ma il cornetto alla crema lo ho preso lo stesso
Devi accedere o registrarti per scrivere nel forum
6 risposte