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

Poziom 1 Lekcja 10, operacje matematyczne ++x vs x++

Ostatnio zmodyfikowano 2015-11-05 17:26
Autor Wiadomość
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
C/C++
#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; //czemu tu po postikrementacji a=11, a nie 12?
    cout << "a+b= " << a + b << endl; // tu już ma 12 i wynik jest 15 i to mi pasuje
    cout << "a= " << a << endl; // i tu już jest 12 to tez mi pasuje
   
    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
 
P-139651
pekfos
» 2015-11-04 20:28:47
C/C++
cout << "a++= " << a++ << " a= " << a << endl; //czemu tu po postikrementacji a=11, a nie 12?
Kolejność obliczania podwyrażeń jest nieokreślona.
P-139652
carlosmay
» 2015-11-04 21:16:16
P-139654
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


P-139665
carlosmay
» 2015-11-05 12:12:41
Wszystko zależy od kompilatora.
P-139666
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.
P-139673
« 1 »
  Strona 1 z 1