linux-l: C frage

Peter J. Weyers weyers at ifh.de
Di Apr 14 13:15:15 CEST 1998


On Sun, 12 Apr 1998, Ihno Krumreich wrote:

> Das kann leider sehr gut moeglich sein. Vor kurzem hatten wir den Fall.
> das der Borland C-Compiler ein anderes Ergebnis lieferte als der 
> Microsoft (beide auf Windof), gcc auf Linux und cc Auf Solaris. Es war
> der alte Trick mit dem man Studenten zu verwirren versucht, wenn man eine
> Variable in einem Ausdruck mit Postincrement und Postdecrement behandelt.
> Bei einigen Ausdruecken ist in C nicht eindeutig geregelt in welcher
> Reihenfolge der Ausdruck evaluiert werden muss. An manchen Stellen
> kann einem auch der Optimierer einen Streich spielen.

Nochmal im Klartext:

 Wenn eine Variable in einem Ausdruck mehr als einmal vorkommt, dann
 solltem man in die Post/Praeincrement/decrement  (Also x++,x--,--x,++x
 fuer die Variable x) Operatoren NICHT in diesem Ausdruck benutzen.

 Das KANN nicht portable sein, das im Standard festzulegen ist vermutlich
zugunsten der Optimirbarkeit bewusst ausgelassen worden. Insbesondere
kann auch der gleiche Compiler das verschieden umsetzen (z.B. wie erwaehnt
bei verschiedenen Optimierungslevels).

Eine Falle in dem Zusammenhang kann auch sein, das zuweilen I/O
"Funktionen" wie putc() etc. als Macro definiert sind. Wenn das da
so expandiert wird, dass der Text im expandierten Makro mehr als einmal
vorkommt, dann hat man eventuell einen Ausdruck, in dem eine Variable, die
mit einem solchen Operator im "Funktionsaufruf" steht, unbeabsichtig mehr
als einmal in/decrementiert wird ... boese Falle !

Ein Beispiel: Wird das Makro (Der Einfachheit halber hat es nix mit I/O zu
tun) reldif(,) 

#define reldif(a,b)     ( ( a - b ) / ( a + b ) )

so aufgerufen:

      z[k] = reldif(x[i++],y[j++])

so steht nach dem es vom Praeprozessor geparsed wurde da

      z[k] = ( ( x[i++] - y[j++] ) / ( x[i++] + y[j++] ) )

was natuerlich i und j zweimal statt einmal incrementiert. 
Da die Implementation dieser I/O Macros Compilerabhaengig sind, kann das
natuerlich auch zu unterschiedlichen Ergebnissen fuehren.

Hope it helps,

Peter
  ,--------------------------------------------------------------------.
  |Phone:  033762/77-507 , 030/2093-7812  | http://www.ifh.de/~weyers/ |
  `--------------------------------------------------------------------'






Mehr Informationen über die Mailingliste linux-l