Skocz do zawartości

"Arduino w akcji" pierwszy projekt


Pomocna odpowiedź

main.c:132:7: warning: operation on 'x' may be undefined

Faktycznie skompilowane za pomoca gcc na PC daje w wyniku 1. Nie zmienia to faktu, ze program jest niepoprawny, a wynik bedzie zalezal od kompilatora i optymalizatora.

W sieci jest troche informacji o podobnych problemach np. tutaj:

http://stackoverflow.com/questions/4968854/is-i-i-truly-a-undefined-behavior

http://stackoverflow.com/questions/6716189/i-i-doesnt-increment-i-why

http://www.coderanch.com/t/408774/java/java/explain

[ Dodano: 30-04-2015, 17:46 ]

Jeszcze jako ciakawostka:

int main()
{
   int x = 0;
   int state = 0;

   state = x = state++;
   cout << "wartosc zmiennej to: " << state << endl;
   cout << "wartosc zmiennej to: " << x << endl;

   return 0;
}

Tutaj dopiero widac, ze kompilator nie zawsze generuje poprawne programy.

Kompilujac g++ (Debian 4.4.5-8) 4.4.5

state = 1, a x = 0 !

http://gcc.godbolt.org/

int main() {
 int state = 1;
 state = state++;
 return state;
}

Z optymalizacją daje po prostu

return 1;

Bez optymalizacji widzimy co się dzieje:

mov    DWORD PTR [rbp-4], 1   ;state = 1
mov    eax, DWORD PTR [rbp-4] ;tmpA = state
lea    edx, [rax+1]           ;tmpB = tmpA+1
mov    DWORD PTR [rbp-4], edx ;state = tmpB -> Słowa Elvisa "Czyli nawet jesli state ulegnie zmianie to na krotko."
mov    DWORD PTR [rbp-4], eax ;state = tmpA
mov    eax, DWORD PTR [rbp-4] ;tmpA = state; return tmpA

A tak generalnie to język C/C++ ma właśnie zestaw tak zwanych "operacji niezdefiniowanych", których wynik zależy od użytego kompilatora, a programista formalnie nie ma jak przewidzieć wyniku i takich operacji nie należy używać w normalnym programowaniu. To właśnie przykład takiej operacji.

  • Lubię! 2

Daje piwo za linka: http://gcc.godbolt.org/ - super narzedzie, ja wczoraj kompilowalem na wszystkim co mialem pod reka, a mozna to zrobic latwiej online.

Prosba do adminow - moze warto wydzielic fragment dyskucji z tematu dla poczatkujacych?

Podsumowujac:

state = state++;

Jest niepoprawne w C/C++, wartosc jest nieokreslona, zalezy od wersji kompilatora, a nawet od ustawien kompilacji (poziomu optymalizacji kodu). Nie nalezy takich konstrukcji uzywac. Zamiast tego nalezy napisac:

state++;

lub

state = state + 1;
Prosba do adminow - moze warto wydzielic fragment dyskucji z tematu dla poczatkujacych?

To by trzeba było chyba cały temat wydzielić 🙂 Niech będzie jak jest, zobaczymy co będzie dalej.

Marooned, Elvis

Czyli wszystko się wyjaśniło 🙂 dziękuję za zainteresowanie tematem no i chyba trzeba skrobnąć maila do wydawcy "Arduino w akcji"...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...