Poziom 1 Lekcja 10, operacje matematyczne ++x vs x++
Ostatnio zmodyfikowano 2015-11-05 17:26
Slawek Temat założony przez niniejszego użytkownika |
Poziom 1 Lekcja 10, operacje matematyczne ++x vs x++ » 2015-11-04 20:14:48 Mam pytanko odnośnie tego niby banalnego kodu dla np: a=10 i b=3, pytania w komentarzach #include <iostream>
using namespace std; int main() { cout << "Podaj dwie liczby calkowite a i b: "; int a, b; cin >> a; cin >> b; cout << "a+b= " << a + b << endl; cout << "a-b= " << a - b << endl; cout << "a*b= " << a * b << endl; cout << "a/b= " << a / b << endl; cout << "a%b= " << a % b << endl; cout << "++a= " << ++a << endl; cout << "a++= " << a++ << " a= " << a << endl; cout << "a+b= " << a + b << endl; cout << "a= " << a << endl; return 0; }
log Podaj dwie liczby calkowite a i b: 10 3 a+b= 13 a-b= 7 a*b= 30 a/b= 3 a%b= 1 ++a= 11 a++= 11 a= 11 a+b= 15 a= 12 |
|
pekfos |
» 2015-11-04 20:28:47 cout << "a++= " << a++ << " a= " << a << endl;
|
Kolejność obliczania podwyrażeń jest nieokreślona. |
|
carlosmay |
» 2015-11-04 21:16:16 |
|
Slawek Temat założony przez niniejszego użytkownika |
» 2015-11-05 11:53:26 Czyli wynik post czy pre inkrementacji zależy od tego jak kompilator ułoży sobie wartość zmiennej w pamięci i wyniki takich obliczeń są nieprzewidywalne? Jakoś nie mogę tego zrozumieć. Znalazłem jeszcze taką odpowiedź użytkownika Nikow http://gynvael.coldwind.pl/?id=369 int a = 5; a = a++ + ++a; a == 6+6+1 == 13 ponieważ: C ma cos takiego jak wagi operatorow. Wedlug nic pierw bedzie POSTINKREMENTACJA (a++), dopiero pozniej bedzie PREINKREMENTACJA (++a), następnie dodawanie. jednakze POSTINKREMENTACJA jest liczona dopiero po ; dlatego też mamy 6 (++5) + 6 (drugi operator już preinkrementowany, więc jest wstawiana preinkrementowana wartosc z czlonu pierwszego) +1 (efekt postinkrementacji). 6+6+1=13. ;) Mam nadzieje że nie zagmatwałem za bardzo. Ktos na lekcjach z C i Operatorów nie uważał.
http://staff.elka.pw.edu.pl/~jarabas/dyd/prm/operatory.pdf http://nadzieja.el-kfa.net/strony/operators.html http://pl.wikibooks.org/wiki/C/Operatory#Priorytety_i_kolejno.C5.9B.C4.87_oblicze.C5.84 |
|
|
carlosmay |
» 2015-11-05 12:12:41 Wszystko zależy od kompilatora. |
|
pekfos |
» 2015-11-05 17:26:48 Czyli wynik post czy pre inkrementacji zależy od tego jak kompilator ułoży sobie wartość zmiennej w pamięci i wyniki takich obliczeń są nieprzewidywalne? Jakoś nie mogę tego zrozumieć. |
Nie. Pamięć nie ma nic do tego. Język nie określa, jak taki kod ma się zachować, czyli kompilatory nie muszą obsługiwać 'poprawnie' tego przypadku. Kompilator wygeneruje do tego jakiś kod, ale z poziomu kodu C++ nie jesteś w stanie określić, jak dokładnie będzie działać. Programy tak pisane są po prostu błędne. |
|
« 1 » |