dziwne działanie prostego programu z 2 instrukcjami???
Ostatnio zmodyfikowano 2011-04-06 20:09
marek Temat założony przez niniejszego użytkownika |
dziwne działanie prostego programu z 2 instrukcjami??? » 2011-04-05 16:48:45 #include <iostream> int main() { int a = 1, b = 1; std::cout << a++<< " " << a++<< " " << a++<< "\n"; std::cout << ++b << " " << ++b << " " << ++b; return 0; }
Wg mnie powinno się wyświetlić
Wyświetla się
|
|
DejaVu |
» 2011-04-05 17:17:45 Gdzieś w necie jest długi artykuł na temat preinkrementacji i postinkrementacji oraz ich niezdefiniowanym zachowaniu w określonych sytuacjach. Nie stosuj takich zapisów w których występuje więcej jak jedna inkrementacja tej samej zmiennej w jednym wierszu. |
|
marek Temat założony przez niniejszego użytkownika |
Dzięki » 2011-04-05 17:28:38 DejaVu
Pół dnia się nad tym męczyłem. Dzięki za zaoszczędzenie mi następnych godzin.
Przy okazji. Gdyby Pan tworzył następną cześć kursu C++ na podstawie " Dodatkowe materiały" to należałaby zmienić przykład w podpunkcie "Rozbudowa możliwości for" w lekcji "Pętla For"
Tam są właśnie 2 takie inkrementacje w jednym wierszu. |
|
DejaVu |
» 2011-04-05 17:43:40 Cały kurs przepisuję, a te dodatkowe materiały to zabytki z wersji kursu 2.0 żeby ci głodni wiedzy mogli sobie poczytać trochę więcej o C++ :P |
|
ison |
» 2011-04-05 23:48:48 std::cout zwyczajnie zaczyna rozpatrywać polecenia od prawej (a do tego dochodzą jeszcze różne dziwne rzeczy z preinkrementacją i postinkrementacją) podobny przykład #include <cstdio>
int GLOBAL_VARIABLE = 0;
int f() { GLOBAL_VARIABLE = 5; return 7; }
int main() { printf( "%d %d\n", f(), GLOBAL_VARIABLE ); }
output to 7 0
a nie 7 5
nie wiem czy to jest zdefiniowane w standardzie ale kiedyś przy debugowaniu kodu na to wpadłem :p |
|
dmx81 |
» 2011-04-06 01:38:59 #include <cstdio>
int GLOBAL_VARIABLE = 0;
int f() { GLOBAL_VARIABLE = 5; printf( "%d \n", GLOBAL_VARIABLE ); return 7; }
int main() { printf( "%d %d\n", f(), GLOBAL_VARIABLE ); }
to juz da 5 7 0 aby zmienic wartosc zmiennej globalnej, trzeba podac ja do funkcji przez wskaznik (referencje) - to na pewno wiadome, tak tylko probuje dojsc co sie tam w srodku funkcji dzieje, tworzy sie kopia ? sprawdzilem ich adresy komorek w pamieci i sa takie same, wiec przy wyjsciu z funkcji kompilator automatycznie przywraca wartosc ? pewnie z kodu asemblera wiecej by mozna wyczytac... #include <cstdio>
int GLOBAL_VARIABLE = 0; int * ptr = NULL; int f() { GLOBAL_VARIABLE = 5; * ptr = GLOBAL_VARIABLE; printf( "%d \n", * ptr ); return 7; }
int main() { printf( "%d %d\n", f(), * ptr ); }
a to to juz wcale sie nie kompiluje...ale za to komplikuje |
|
ison |
» 2011-04-06 07:24:44 wiec przy wyjsciu z funkcji kompilator automatycznie przywraca wartosc ? pewnie z kodu asemblera wiecej by mozna wyczytac...
|
tu nie chodzi o żadne przywracanie, normalnie po wyjściu z funkcji GLOBAL_VARIABLE zawiera 5 (to normalne) Twój kod też nijak się do odnosi do tego problemu mi chodziło o to, że jeśli mamy instrukcję printf( "%d %d\n", f(), GLOBAL_VARIABLE );
to najpierw zostanie obliczona wartość GLOBAL_VARIABLE a dopiero potem zostanie wywołana funkcja f() gdyż argumenty sprawdzane są od prawej strony (nie wiem z czego to wynika) #include <cstdio>
int GLOBAL_VARIABLE = 0;
int f() { GLOBAL_VARIABLE = 5; return 7; }
int main() { printf( "%d %d\n", GLOBAL_VARIABLE, f() ); }
output 5 7
|
|
dmx81 |
» 2011-04-06 08:22:27 zgadza sie :) |
|
« 1 » 2 |