Por favor, me explique este código de incremento operador decremento [fechado]

1

A seguir está o código que eu executo no Ubuntu 13.10. Código: -

    #include<stdio.h>
    main()
    {
       int i=10,j=10;
       i=i++ + ++j;
       printf("i=%d j=%d\n",i,j);
       j=++i + j++;
       printf("i=%d j=%d\n",i,j);
    }

Saída: -

    i=21 j=11 
    i=22 j=33

Logicamente, conforme as regras e devem ser: -

    i=22 j=11
    i=23 j=35

E quando eu executo este código no Ubuntu 12.10, eu fico correto, ou seja, acima de ans. Por favor, explique o que está acontecendo?

    
por Muskaan 22.03.2014 / 06:14

1 resposta

0

Esse é o resultado típico do comportamento indefinido ou dependente da implementação. Quando sua expressão está alterando uma variável em ambos os sites da equação (entre muitas outras situações), você está basicamente fazendo errado. Só porque "funciona" com um lançamento de compilador não significa que ele dará a mesma resposta no próximo lançamento. Leia atentamente a especificação da linguagem para ver que tipo de coisas são indefinidas ou dependentes da implementação e evite-as. Nenhuma resposta é "correta", elas são indefinidas. Respostas diferentes podem até ser desencadeadas por diferentes otimizações do mesmo compilador.

Na prática, você deve usar seus sinalizadores de aviso do compilador e uma ferramenta de análise estática como valgrind ou Purify para sinalizar esse tipo de coisa. E até você entender o significado de termos como "Lvalue" e "Rvalue", apenas usar uma tabela de precedência do operador não é realmente suficiente para entender o que está acontecendo com alguns dos operadores de aumento / redução de pre / post.

    
por ubfan1 22.03.2014 / 06:26