Co oznaczają poniższe instrukcje?

0

Całość programu:

#include <stdio.h>


int main(){
 int x=5, y=5;
int a=1, b=0, c=-2;
double z;
char s[10]="egzamin", *w, c1='y';
w = s+strlen(s)-2;
printf("1) %c\n", *w);
z=(++y-(--x))%x;
printf("2) %.1lf\n", z);
printf("3) %d\n", --s[2]==c1);
z = x/y && !(x%++y);
printf("4) %.2lf\n", z);
int t[10]={0,1,2};
printf("5) %d\n",(2*(++t[2])<<2));
printf("6) %d\n", a<b<c);
}

Nie rozumiem co w tym zapisie oznaczają poniższe instrukcje:
1.

printf("5) %d\n",(2*(++t[2])<<2));
printf("6) %d\n", a<b<c);

mógłby ktoś wyjaśnić?

1

(2*(++t[2])<<2))

operacje biorą pod uwage nawiasy.
Pierwsze wartośc t[2] inkrementowane jest o 1 za pomocą preinkrementacji.
Potem operator mnożenia ma wyższy priorytet nić przesunięcia bitowego. czyli zinkrementowania liczba jest mnożona przez 2
Następnie: liczba w zapisie binarnym przesuwana jest o 2 w lewo tzn po prawej stronie dopisuje się 2 zera.

A to drugie chyba jest blęde, bo jest to algorytm porównania, ale niepoprawny.

0

czyli t[2]=2
++t[2]=3
2*t[2]=6
6=0110
t[2]<<2=011000
011000=24
?

1

Dobrze rozumiesz, wyjdzie 24.

0
daniel1302 napisał(a):

A to drugie chyba jest blęde, bo jest to algorytm porównania, ale niepoprawny.

A czemu błędne?

Wiązanie operatora porównania jest lewostronne, więc po wstawieniu nawiasów mamy:
(a<b)<c
czyli a jest poróœnywane z b i wychodzi z tego 0 albo 1 (fałsz/prawda; tu akurat 0 czyli fałsz), a ta liczba (0) jest porównywana z c (-2) i znowu wychodzi fałsz, więc widzimy 0...

PS. Inna sprawa, że tak nie należy raczej pisać, bo w matematycznym zapisie ma to inne znaczenie -- działa odpowiednio (czyli jako skrót koniunkcji) tylko w Pythonie ze znanych mi języków...

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