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

[C++] Operacje na wskaźniku - kiedy standard określa niezdefiniowane zachowanie?

Ostatnio zmodyfikowano 2015-01-05 21:52
Autor Wiadomość
Kaikso
» 2015-01-05 15:25:42
Standard C jest po to aby programy skompilowane na każdej platformie działały tak samo, dlatego przewiduje niezdefiniowane zachowanie (Undefined Behavior). Jednak taki kod jest dopuszczany, ale po co?

Od tylu lat standard C nie jest rozwijany, a nadal jak by nikt nie miał "własnego mózgu".
P-124210
DejaVu
» 2015-01-05 16:28:28
@Kaikso: Cytaty są ze standardu C++11, więc... nadal wykazujesz się ignorancją w stosunku do obowiązującego standardu.
P-124219
1aam2am1
» 2015-01-05 16:56:24
Przestańcie się kłócić i zamknijcie temat.To prawda że może spowodować to UB.
Ale mówimy tu o programach na PC, i wskaźnik który jest ustawiony na początek tablicy posiada wartość x.
Gdy odejmiemy 1 jesteśmy przed tablicą (UB),
ale dopóki nie będziemy chcieli pobrać/zmienić jego wartości pokazywanej przez wskaźnik (jądro systemu nie zaprotestuje, program będzie działał poprawnie)
II. Początek naszej tablicy nie będzie się nigdy zaczynał od komórki 0 w pamięci ram (więc operacja na wskaźniku odjęcia na wskaźniku przebiegnie pomyślnie)

UB będzie tylko na wyjątkowych platformach. Dlatego w standardzie jest napisane że powoduje to UB, bo język nie jest w stanie zagwarantować poprawności obliczeń.
P-124224
Elaine
» 2015-01-05 18:15:22
Programy użytkownika były odpalane w ring-2, a nad wszystkim czuwał OS (w ring-0).
Pierścienie pojawiły się dopiero w trybie chronionym w 80286, poza tym ten tryb zaczęto szerzej wykorzystywać dopiero po wprowadzeniu 80386. Na 8086 był tylko tryb rzeczywisty, gdzie wszystko działa bez jakichkolwiek ograniczeń.


Od tylu lat standard C nie jest rozwijany
Ostatnia wersja standardu C pojawiła się w 2011, a ostatnia publiczna aktywność grupy roboczej jest z grudnia 2014.
P-124232
Kaikso
» 2015-01-05 18:17:54
Ja jedynie próbowałem przedstawić praktyczne działanie. Jeśli ktoś programuje na takie platformy to jest tego świadomy, a po za tym to po co bawić się z poprawnością kolejności działań arytmetycznych (to jest moje zdanie).
Początek naszej tablicy nie będzie się nigdy zaczynał od komórki 0 w pamięci ram (więc operacja na wskaźniku odjęcia na wskaźniku przebiegnie pomyślnie)
 Może się zaczynać od komórki 0 na obecnie wykorzystywanych procesorach stosuje się pamięć wirtualną. Ale i tak wynik będzie poprawny, działania te zostały wcześniej zaprezentowane.

Jeśli inaczej uważacie to po prostu to zignorujcie.

@Alueril: Faktycznie przeoczyłem C11, mój błąd.
P-124233
DejaVu
» 2015-01-05 19:00:58
(..) a po za tym to po co bawić się z poprawnością kolejności działań arytmetycznych (to jest moje zdanie).
Bo kolejność wykonywnaia działań ma znaczenie. Jak będzie życie zależało od tego czy najpierw pójdziesz w prawo, a potem w lewo, a nie na odwrót to zaczniesz przywiązywać do tego wagę. Bylejakość trzeba zwalczać w sobie u podstaw, a nie jeszcze usilnie bronić własnych teorii, zamiast zaakceptować fakt, że wg standardu omawiany kod ma niezdefiniowane zachowanie. Jak masz taką politykę wytwarzania własnego kodu to okej. Zachowaj ją jednak dla siebie, a nie wmawiasz wszystkim dookoła, że masz rację, bo jej po prostu nie masz.
P-124243
GolemXIV
» 2015-01-05 21:52:30
Pierścienie pojawiły się dopiero w trybie chronionym w 80286, poza tym ten tryb zaczęto szerzej wykorzystywać dopiero po wprowadzeniu 80386. Na 8086 był tylko tryb rzeczywisty, gdzie wszystko działa bez jakichkolwiek ograniczeń.
Tak. Z pamięci pisałem. o rany - jak to dawno było :)


Wind catches lily
Scatt'ring petals to the wind:
Segmentation fault.
P-124270
1 2 3 4 5 6 7 « 8 »
Poprzednia strona Strona 8 z 8