Dlaczego program wypisuje wartość "1"?

2015-02-02 19:51
0

Dlaczego w drugim printfcie zostaję wypisana wartość 1 ? Na czym to polega ?

int z1 = 4, z2 = 8;
    int m = 1;
    int t[10] = {-1,-2,-3};
    char s1[30] = "programowanie", s2[30] = "strukturalne";
    double z=(++z2-(z1--))%--z1;
    printf("1) %.1lf\n", z/3);
    printf("2) %d\n", --s1[2]<*s2); 
    printf("3) %c\n", *(strlen(s1) - 4 + s1));

litera r jest mniejsza od litery s w kodzie ASCII ? O to chodzi ?

I jeszcze pytanie 3 pritnfa. Dlaczego litera zostaje wyświetlona a ? Bo według mnie wygląda to tak 13 - 4 + 13, czyli zostaje wyświetlony 9 element s1 czyli litera w.

edytowany 2x, ostatnio: nowicjusz35, 2015-02-02 20:00

Pozostało 580 znaków

2015-02-02 20:00
kq
3

litera r jest mniejsza od litery s w kodzie ASCII ? O to chodzi ?

Tak, ale jeśli chcemy być w 100% zgodni ze standardem, to prawidłowa odpowiedź to "wynik zależy od implementacji (może być 1 lub 0), ponieważ użycie ASCII, ani nawet liter alfabetu w kolejności nie jest gwarantowane".

I jeszcze pytanie 3 pritnfa. Dlaczego litera zostaje wyświetlona a ? Bo według mnie wygląda to tak 13 - 4 + 13, czyli zostaje wyświetlony 9 element s1 czyli litera w.
Indeksacja jest od zera, s[0] to pierwszy element, a s[9] to dziesiąty.


edytowany 1x, ostatnio: kq, 2015-02-02 20:02
Pokaż pozostałe 5 komentarzy
Wtedy miałbyś *(13-4+13) = *(22). A co to jest gwiazdka od 22 to ja nie wiem. s1 to adres na pierwszy element, *(9+s1) = *(s1+9) to wartość pod adresem dziesiątego elementu. - twonek 2015-02-02 20:52
To już chyba zaczynam rozumieć. *(strlen(s1) - 4 + s1)) ,czyli strlen(s1), gdzie s1 to adres na pierwszy element oraz określa ile tych elementów jest w tablicy, potem -4 i + 13 - nowicjusz35 2015-02-02 20:59
Nie ma żadnego +13 potem. Jest *(strlen(s1)-4+s1) czyli *(13-4+s1), czyli *(9+s1), co można inaczej zapisać jako *(s1+9). - twonek 2015-02-02 21:12
to po co w takim razie te ostatnie +s1 ? Nie chodzi o to że jakby o 13 miejsc się przesuwa indeks, ale to nic nie zmienia, bo przecież to ilość wyrazów w tablicy. - nowicjusz35 2015-02-02 21:16
dobra już wiem - nowicjusz35 2015-02-02 21:19

Pozostało 580 znaków

2015-02-02 20:27
0

A jeszcze mam kolejny 4 printf:

printf("4) %.2lf\n", !(z1%z2--) + 2.0*z1/z2); 

I tak to będzie wyglądać !(2%9) + 2.0 * 2/9 i wychodzi 0,44, więc dlaczego kompilator wyświetla 0.50 ? Przecież w dół powinno być zaokrąglenie.

I możę ktoś jeszcze pomoże z 5 printfem:

 printf("5) %d/n", (3*(++*(t+2)>>2)));

Dla mnie wychodzi (3*(-2>>2)
A przecież operatory bitowe działają tylko na typie unsigned. Coś źle myślę ?

edytowany 1x, ostatnio: nowicjusz35, 2015-02-02 21:34
Nieprawda, operatory bitowe nie działają tylko na unsigned. - Proxima 2015-02-02 23:18
A byś pomógł mi to zamienić ? - nowicjusz35 2015-02-02 23:25
Bo wiem, że dla typu signed zależy to od kompilatora. Ale jak mam to zrobić jak przy tym nie mogę używać kompilatora ? - nowicjusz35 2015-02-02 23:26

Pozostało 580 znaków

2015-02-02 23:06
0

Pomoże ktoś?

Pozostało 580 znaków

2015-02-02 23:47
2

a to, że

double z=(++z2-(z1--))%--z1;

może być UB to nikt nie widzi?

edit:
http://melpon.org/wandbox/permlink/P3AYP6pgZIuyRIlq

edytowany 1x, ostatnio: gośćabc, 2015-02-02 23:51
http://en.wikipedia.org/wiki/Undefined_behavior coś z czym musi walczyć każdy programista c i c++, co do Twojego problemu poczytaj http://stackoverflow.com/ques[...]-behavior-and-sequence-points, edit jedym zdanim modyfikujesz zmienne w sequence poincie (tej linijce) więcej niż raz, i nie jest zdefiniowane, która z operacji ma być wykonana jako pierwsza (Dla operatorów -- i ++, dlatego jest to niezdefiniowane zachowanie, które powoduje błąd - gośćabc 2015-02-03 00:12
podaj do równanai wartości, które chcesz żeby tam wylądowały, a zmodyfikuj je poza równaniem - gośćabc 2015-02-03 00:16

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0