Proszę o objaśnienie wyliczeń.

0

Witam. Zadanie pochodzi z książki C. Delannoy'a "Ćwiczenia z języka C".
Już pisałem w sprawie poprzedniego zadania z tej książki, ale musiałem zrobić nie zaplanowaną przerwę więc stąd wzięła się moja ne systematyczność. Jest to zadanie 1.6 ze strony 13.
Jakie wyniki otrzyma się po wykonaniu następującego programu?

# include <stdio.h>
main()
{
int n, p, q;
//przypadek 1
n=5; p=2;
q=n++>p||p++!=3;
printf("A: n=%d, p=%d, q=%d\n", n, p ,q);

//przypadek 2
n=5; p=2;
q=n++<p||p++!=3;
printf("B: n=%d, p=%d, q=%d\n", n, p ,q);

//przypadek 3
n=5; p=2;
q=++n==3&&++p==3;
printf("C: n=%d, p=%d, q=%d\n", n, p ,q);

//przypadek 4
n=5; p=2;
q=++n==6&&++p==3;
printf("D: n=%d, p=%d, q=%d\n", n, p ,q);
}

Odpowiedzi do tego zadania są następujące:

A: n=6, p=2, q=1
B: n=6, p=3, q=1
C: n=6, p=2, q=0
D: n=6, p=3, q=1

I tu rodzi się moje pytanie. Bo o ile wiem jak jest wyliczone q jest to zawsze prawda lub fałsz tak za nic nie mogę rozczaić jak wyliczone jest n i p. W pierwszym przypadku p jest raz wyliczane przed inkrementacją a w drugim po. I podobnie nie wiem jak w przypadku 3 i 4 jest obliczane n.Dlatego proszę o wyjaśnienie mi tych zasad lub jak odpowiedzi na te pytania mam szukać.
Z góry dziękuję.

0

q=n++>p||p++!=3;

q = n>p || p!=3;
n++;
p++;

q=n++<p||p++!=3;

q = n<p || p!=3;
n++;
p++;

q=++n==3&&++p==3;

++n;
++p;
q = n==3 && p==3;

q=++n==6&&++p==3;

++n;
++p;
q = n==6 && p == 3;
0

@Azarien zgadza się to co napisałeś ale i tak nie kumam bo operator ++ ma w tych zależnościach najwyższy priorytet co takiemu początkującemu jak mnie wskazuje na to że będzie w wyrażeniu wykonany jako pierwszy. Mógł by ktoś to łopatologicznie wyłożyć?

0

Jak widzisz, można go umieścić w dwóch różnych miejscach - przed zmienną i po zmiennej. Zapisanie n++ daje zupełnie inny efekt niż ++n. Wyciągnij wnioski z powyższych przykładów @Azariena.

0
n=5; p=2;
q=n++>p||p++!=3;

nierówność n++>p jest prawdziwa, zatem drugim człon alternatywy (p++!=3) nie jest w ogóle wyliczany, zatem n==6, p nie ulega zmianie, alternatywa jest prawdziwa (q==1)

n=5; p=2;
q=n++<p||p++!=3;

nierówność n++<p nie jest spełniona, więc obliczany jest drugi człon alternatywy, p++ jest operatorem postinkrementacji (p zostaje zwiększone po użyciu w wyrażeniu), w chwili porównywania p==2, ponieważ 2!=3, to q==1

0

Ale ja jestem tępy @bogdans masz racę dla operatora || wystarczy że jedne warunek jest prawdziwy, ten który jest fałszywy nie jest wyliczany w przeciwieństwie do &&gdzie każdy ma znaczenie.
Dziękuję za szybką odpowiedź.

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