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

Problem ze zrozumieniem Symfonii C++

Ostatnio zmodyfikowano 2013-03-04 23:49
Autor Wiadomość
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.
P-77702
Monika90
» 2013-03-04 23:14:07
na przykład zamiast
i
 mógłbyś mieć:
C/C++
tab[ n + 5 ]
wtedy zamiast
i = i + 1
 masz:
C/C++
tab[ n + 5 ] = tab[ n + 5 ] + 1
a zamiast
i += 1
:
C/C++
tab[ n + 5 ] += 1
P-77703
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?
P-77704
Monika90
» 2013-03-04 23:21:13
C/C++
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
C/C++
tab[ n++ ] += 1;
jest dobrze zdefiniowane.
P-77705
Berux
Temat założony przez niniejszego użytkownika
» 2013-03-04 23:28:55
A coś takiego się skompiluje?
P-77706
killjoy
» 2013-03-04 23:36:33
Sam sobie odpowiedz:
C/C++
#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;
}
P-77708
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:
C/C++
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...
P-77709
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...)?
P-77711
« 1 » 2
  Strona 1 z 2 Następna strona