Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

dziwne działanie prostego programu z 2 instrukcjami???

Ostatnio zmodyfikowano 2011-04-06 20:09
Autor Wiadomość
marek
Temat założony przez niniejszego użytkownika
dziwne działanie prostego programu z 2 instrukcjami???
» 2011-04-05 16:48:45
C/C++
#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ć
1 2 3
2 3 4

Wyświetla się
3 2 1
4 4 4


P-30327
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.
P-30328
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.
P-30330
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
P-30333
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
C/C++
#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
P-30343
dmx81
» 2011-04-06 01:38:59
C/C++
#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...

C/C++
#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
P-30344
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ę
C/C++
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)

C/C++
#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
P-30346
dmx81
» 2011-04-06 08:22:27
zgadza sie :)
P-30347
« 1 » 2
  Strona 1 z 2 Następna strona