Kolejność ewaluacji parametrów funkcji jest niezdefiniowana. A przeciążony operator jest funkcją. Nie można powiedzieć, w jakiej kolejności będzie ci się wykonywać ten cały łańcuch „operatorów” <<
@Rincewind: @KrzaQ2: co ciekawe tu, na stronie pewnej warszawskiej prywatnej (choc uznawanej za nienajgorsza) uczelni jest ten sam blad: (ostatnia ramka z kodem):
If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
Mikrobki, dlaczego licznik (counter) nie dziala?
#include "iostream"
int counter;
int A(int n, int m)
{
counter++;
if(n==0)
return m+1;
else
{
if((n>0)&&(m==0))
return A((n-1),1);
else
if((n>0)&&(m>0))
return A(n-1,A(n,m-1));
}
}
int main()
{
int n, m;
counter=0;
std::cin>>n>>m;
std::cout<
return 0;
}
Ponadto napisz sobie
Using namespace std;
Po include. Wtedy możesz usunąć wszystkie std z tekstu. Będzie bardziej przejrzysty.
nie mniej nie zmienia to nic w kwestii licznika wywolan rekurencji
Jestem z telefonu, a tutaj się ciężko jakieś kody ogarnia. Jsk nikt nie pomoze to e domu sprawdzę. ;-)
@erwit:
counter;
counter++; ?
edit: tak tez nie dziala... nie wiem o co chodzi, przeciez ta zmienna jest zadeklarowa
std::cout<
std::cout<<"counter: "<
Kolejność ewaluacji parametrów funkcji jest niezdefiniowana. A przeciążony operator jest funkcją. Nie można powiedzieć, w jakiej kolejności będzie ci się wykonywać ten cały łańcuch „operatorów”
<<
–cout << A() << endl; cout << counter;http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node71.html
to się sprowadza do
cout << ++i << i;counterbył w wielu miejscach zmieniany. A jest tylko w jednym. Z tego wynika, że UB nie zachodzi, ale order of evaluation jest unspecified.
~ n3337 (aka darmowa wersja standardu C++11)