Berux Temat założony przez niniejszego użytkownika |
Problem ze zrozumieniem Symfonii C++ » 2013-03-04 23:09:30 Witam. Czytam sobie Symfonię C++ i natknąłem na problem. Mianowicie mam coś takiego: i += 2 oznacza i = i + 2 i-= 2 oznacza i = i - 2; (...)jeśli i jest wyrażeniem, to w naszym nowym zapisie jest ono obliczane tylko jednokrotnie (w starym - dwa razy).Może to mieć znaczenie, jeśli wyrażenie to ma jakieś działania uboczne (np. inkrementacja). |
Konkretnie nie mogę zrozumieć, kiedy i jest wyrażeniem. Domyślam się ,że może tu chodzić np. o: (i + 2) -= 2; Ale proszę o wytłumaczenie tego dokładnie. Z góry dzięki. |
|
Monika90 |
» 2013-03-04 23:14:07 na przykład zamiast i mógłbyś mieć: wtedy zamiast i = i + 1 masz: tab[ n + 5 ] = tab[ n + 5 ] + 1
a zamiast i += 1 : |
|
Berux Temat założony przez niniejszego użytkownika |
» 2013-03-04 23:17:20 To znaczy, że Może to mieć znaczenie, jeśli wyrażenie to ma jakieś działania uboczne (np. inkrementacja) |
Mam traktować jako np. tab[ n++ ] += 1; Tylko jakie to ma znaczenie, że to wyrażenie jest obliczane jednokrotnie, a nie dwukrotnie? /edit: Może chodzi tu o to, że w tab[ n++ ] += 1; kiedy n miało wartość 5, to teraz dodajemy do szóstego elementu 1, a gdy obliczamy wyrażenie dwukrotnie, to do szóstego elementu przypisujemy wartość siódmego elementu zwiększonego o jeden. Dobrze myślę? @post niżej Rozumiem. Jednak mam pytanie czy dobrze myślę z tym co napisałem, gdy zedytowałem post? |
|
Monika90 |
» 2013-03-04 23:21:13 tab[ n++ ] = tab[ n++ ] + 1;
W powyższym przykładzie takie ma znaczenie, że masz dwie modyfikacje zmiennej n w tym samym wyrażeniu, to prowadzi do tak zwanego UB (undefined behavior). Jest to poważny błąd. Natomiast jest dobrze zdefiniowane. |
|
Berux Temat założony przez niniejszego użytkownika |
» 2013-03-04 23:28:55 A coś takiego się skompiluje? |
|
killjoy |
» 2013-03-04 23:36:33 Sam sobie odpowiedz: #include <iostream> using namespace std;
int main() { int tab[ 5 ] = { 0 }; int n = 1; tab[ n++ ] = tab[ n++ ] + 1; cout << "tab[n]=" << tab[ n ] << endl; cout << "tab[n-2]=" << tab[ n - 2 ] << endl; system( "PAUSE" ); return 0; }
|
|
Monika90 |
» 2013-03-04 23:39:02 Undefined behavior oznacza, że kompilator może zrobić co mu się podoba, na przykład: nie skompilować, albo wygenerować kod który będzie robił najzupełniej dowolną rzecz. Innym słowy UB to błąd w programie, którego kompilator nie ma obowiązku wykryć. Czasami jednak potrafi wykryć taki błąd: int main() { int tab[ 4 ] = { }; int n = 0; tab[ n++ ] = tab[ n++ ] + 1; }
próba kompilacji za pomocą g++ -Werror=sequence-point test.cpp daje: test.cpp: In function 'int main()': test.cpp:5:28: error: operation on 'n' may be undefined [-Werror=sequence-point] cc1plus.exe: some warnings being treated as errors
Natomiast, w tym cytacie z "Symfonii C++" chodzi o to, że i += 1 to jest to samo co i = i + 1 pod warunkiem, że i nie jest wyrażeniem, które ma jakieś efekty uboczne, takie np. jak: inkrementacja, albo przypisanie, albo wywołanie funkcji która wykonuje operacje I/O, itp... |
|
Berux Temat założony przez niniejszego użytkownika |
» 2013-03-04 23:45:17 @killoy Tak sobie analizuję twój kod i zastanawiam się, dlaczego element drugi tej tablicy jest równy 1, a nie trzeci. Czyżby odnosi się to do tego co napisała Monika90 (przepraszam, że tak po nazwie użytkownika, ale...)? |
|
« 1 » 2 |