[C++/VC8] Expression Evaluation Order & Warnings?

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik had de volgende code in een applicatie staan:
C++:
1
serial[j++] = (1000 - s.data()[i] % 10 + (serial[j] - '0')) % 10 + '0';

Ik had geen idee waarom die niet meer werkte met VC8 (met VC6 werkte die wel) totdat ik er wat beter naar keek.
De j++ wordt blijkbaar uitgevoerd voor de (tweede) j.
Hierdoor is de code dus dubbelzinnig, maar waarom genereert de compiler hier eigenlijk geen warning voor?

[ Voor 4% gewijzigd door Olaf van der Spek op 29-03-2006 15:04 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tja, een "mail de makers" reactie volstaat hier eigenlijk wel ;). Het is natuurlijk gewoon legale code (met een ongedefinieerde uitwerking), een warning had idd mooi geweest.
Dit werkt wel zoals je verwacht:
C++:
1
serial[j] = (1000 - s.data()[i] % 10 + (serial[j] - '0')) % 10 + '0', j++;

Maar goed, dan kun je de j++ net zo goed verplaatsen naar een volgend statement.

[ Voor 41% gewijzigd door .oisyn op 29-03-2006 15:06 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Tja, een "mail de makers" reactie volstaat hier eigenlijk wel .
Dat dacht ik ook, maar dat leek eigenlijk te simpel om waar te zijn.

g++ geeft wel netjes een warning. :)

C++:
1
2
3
4
5
6
7
8
9
10
int main()
{
        int a[] = {1, 2};
        int j = 0;
        a[j++] = j;
        return 0;
}

z.cpp: In function 'int main()':
z.cpp:5: warning: operation on 'j' may be undefined

[ Voor 26% gewijzigd door Olaf van der Spek op 29-03-2006 15:12 ]