Dlaczego program wypisuje wartość "1"?

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.

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.

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ę ?

0

Pomoże ktoś?

2

a to, że

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

może być UB to nikt nie widzi?

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

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