Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » unerwartetes Ergebnis in Inkrementier Prog

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.01.2007, 23:39 Uhr
kasimirle



Hallo, bin absoluter C++ Anfänger und nutze Borland C++Builder X zum linken + compilen auf Win XP SP2 Professional OEM Laptop.

Habe mir folgendes Übungsprogramm ausgedacht (nutze zum lernen "jetzt lerne ich C++ von Markt und Technik"):

************************


C++:
#include <iostream>

int main ()
{
int a, b, c;

  c=b++;
  b=a++;
  a=6;

  std::cout <<  c;
  std::cin.get();

  return 0;
}



***************

erwartet war, dass c den wert b inkremtiert anfragt. b ist a inkrementiert. a ist 6. 6 + 1 = 7; 7 + 1 = 8. daher sollte "std::cout << c;" 8 als Ergebnis liefern. Das Standardausgabemedium macht aber:

*****************

C:\Dokumente und Einstellungen\Thomas Zettler\cbproject\test\windows\Release_Build\test.exe
10364696

...also ein bißchen viel ... was ist falsch??

LG kasimirle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.01.2007, 00:24 Uhr
Blubber2063



Das kann ich dir sagen, die Reinfolge deiner Statements. a, b und c sind zu beginn undefiniert, da kann alles mögliche drinne stehen. deshalb ist c = b++ ebenfalls undefiniert
und b = a++ genau so, es steht nach ablauf nur fest das a=6 ist. Das ist kein Gleichungssystem, Imperative Sprachen arbeiten streng sequentiell, auch wenn dir der Compiler für Optimierungen evtl. die Reinfolge ändert, die einträge sind hier definitiv undefiniert. Also initialisiere a mit 6, weise dann b zu und dann erst c, dann stimmt dein Beispiel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.01.2007, 00:57 Uhr
0xdeadbeef
Gott
(Operator)


Erstens, wie blubber schon sagte, die Reihenfolge stimmt nicht und zweitens, du benutzt Postinkrements.

C++:
b = a++;


ließe sich auch als

C++:
b = a;
a = a + 1;


schreiben. Im Gegensatz dazu ist das Präinkrement, also

C++:
b = ++a;


äquivalent zu

C++:
a = a + 1;
b = a;


Generell ist es in C++ guter Stil, das Präinkrement zu benutzen, wo es keinen Unterschied macht, d.h. z.B.

C++:
for(int i = 0; i < 10; ++i) do_stuff();


statt

C++:
for(int i = 0; i < 10; i++) do_stuff();


weil im Fall komplexer Datentypen das Präinkrement typischerweise einen Kopierkonstruktor bei der Rückgabe spart, z.B.

C++:
class foo {
public:
  foo(int x = 0) : x_(x) { }

  void val(int x) { x_ = x; }
  int val() const { return x_; }
  
  foo &operator++() {   // Präinkrement
    ++x_;
    return *this;
  }

  foo operator++(int) {   // Postinkrement
    foo ret(x_); // 1. Hier ein Extra-Objekt
    ++x_;
    return ret; // 2. Kopie bei der Rückgabe
  }
  

private:
  int x_;
};


Hier ist

C++:
foo bar;
++bar;


effizienter als

C++:
foo bar;
bar++;


von besonderem Interesse ist das natürlich bei Funktionstemplates, a la

C++:
template <typename number_t> number_t &increment(number_t &x) {
  return ++x;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 26.01.2007 um 01:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: