Mam pytanie, w jaki sposób kompilator działa na następującym kodzie:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Nie jestem pewien, dlaczego wynik jest d = 11
.
Mam pytanie, w jaki sposób kompilator działa na następującym kodzie:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Nie jestem pewien, dlaczego wynik jest d = 11
.
Odpowiedzi:
W
int d = (b == c++) ? (c+1) : (c-1);
:c++
jest bieżąca wartośćc
11. Oddzielniec
zwiększa się do 12.b == 11
jest fałszywe, ponieważb
ma 12 lat.(b == c++)
jest fałszywe,(c-1)
jest używane. Doc
tego punktu należy również wykonać przyrost o 12.c
ma 12 lat,c-1
ma 11 lat.d
jest inicjowany do tej wartości, 11.źródło
Zgodnie ze standardem C (operator warunkowy 6.5.15)
Tak więc w inicjującym wyrażeniu tej deklaracji
zmienna
b
jest porównywana z wartością zmiennej,c
ponieważ operator po inkrementacji zwraca wartość swojego argumentu przed jego inkrementacją.Ponieważ wartości nie są sobie równe (
b
jest ustawione na 12, podczas gdyc
jest ustawione na 11), wówczas podwyrażenie(c-1)
jest oceniane.Zgodnie z cytatem istnieje punkt sekwencyjny po ocenie stanu operatora. Oznacza to, że po ocenie warunku
c
ma wartość12
po zastosowaniu operatora po-przyrostowego do zmiennejc
. W rezultacie zmienna d jest inicjalizowana przez wartość1
(12 - 1
).źródło
?:
. Ponieważ zwykle w C łączenie++
z innymi operacjami na tym samym operandzie jest niezdefiniowanym zachowaniem. Ten kod działa tylko przewidywalnie, ponieważ?:
ma różne specjalne reguły dotyczące płatków śniegu.Ponieważ warunek jest fałszywy, dlatego
false
tak się stanie :,c-1
ale ponieważ zwiększyłeśc
warunek oc++
, dlategoc
jest teraz12
. Wynik zatem 12 - 1, który wynosi 11.EDYCJA: To, co OP źle zrozumiał, to przyrost postu.
Tak więc to, co się naprawdę wydarzyło, wygląda następująco:
źródło
c++
pod uwagę warunek. Warunek jest fałszywy, ale do obliczenia używana jest wartość oryginalna parametru , a nie wersja przyrostowa.c
c - 1
c++
i++c
c++
jest operatorem post- increment. Wartośćc++
wynosi 11, z efektem ubocznym tworzeniac == 12
.++c
miałby wartość 12.Przetłumaczony na zwykłą instrukcję if twój kod wyglądałby tak:
Chodzi tutaj o to, że c jest zwiększane po sprawdzeniu warunku. Wchodzisz więc w
else
stan, ale c ma już tam wartość 12.źródło
Patrz operator trójskładnikowy.
Składnia
Więc napisałeś
W tej sytuacji wynikiem będzie 11, ponieważ po sprawdzeniu wartość „c” wzrasta (c + 1 = 12), a dopiero potem ustawia wartość „d” na c (12) -1, która wynosi 11.
Jeśli używałeś na przykład:
Wartość „c” byłaby zwiększona przed sprawdzeniem instrukcji, więc byłaby to prawda, a wartość „d” wynosiłaby c (12) +1, czyli 13.
źródło