2012-05-23 23 views
5

Jeśli pierwszeństwo w stosunku do & jest większe niż ||, nie powinno tego kodu oceniać --b & & ++ c pierwsze, a zatem wynik powinien wynosić 1 2 4 11. Ale tutaj to wydaje się być zwarty, aby dać 1 2 5 10. Proszę o pomoc!kolejność oceny || and && in c

int x; 
int a=1,b=5,c=10; 
x=a++||--b&&++c; 
printf("%d %d %d %d\n",x,a,b,c); 
return 0; 

Odpowiedz

14

nie powinno to kod ocenić --b & & ++ c pierwszy

nr Operator pierwszeństwo nie ma wpływu na kolejność oceny. To po prostu oznacza, że ​​

a++||--b&&++c 

jest equilvalent do

a++||(--b&&++c) 

więc nadal a++ który ocenia najpierw, a co za tym idzie zwarcie oświadczenie.

+0

Skąd wiemy, kiedy umieścić nawiasy, a kiedy nie? – Ashwyn

+2

@Ashwyn dobrą zasadą jest umieszczanie nawiasów wszędzie tam, gdzie intencje nie są jasne. W tym przypadku nie chodzi o klamry, IMO jest całkiem jasne, co się dzieje. –

+0

@Ashwyn Myślę, że brakuje ci sensu. Masz rację, zakładając, że && jest ciaślej niż ||.Ale wyrażenie nadal ocenia od lewej do prawej. –

2

Priorytet && jest wyższy, co oznacza, że ​​wiąże się mocniej z rzeczami po lewej i prawej stronie niż ||. Tak, że wyrażenie jest równoważne

a++ || (--b && ++c) 

|| ocenia tylko coś po prawej stronie, jeśli wyrażenie po lewej ocenia się non-0. Ponieważ a jest równy 1, tylko a++ zostanie oceniony, a b nie zostanie zmniejszony, a c nie zostanie zwiększony.

2

Tak, && ma wyższy priorytet, ale to tylko określa grupowania z argumentami, a nie kolejność oceny. Podstawową operacją jest tutaj ||, która gwarantuje, że prawa strona nie jest oceniana, jeśli lewe jest prawdziwe, niezależnie od operacji po prawej stronie.

1

Istnieją dwie koncepcje w pracy tutaj

  1. Operator asocjatywność
  2. Compiler optymalizacja zwarciem

W C || operator pozostaje asocjacyjny. W rezultacie, ++ zostanie ocenione jako pierwsze. Ponieważ po lewej stronie jest PRAWDA, optymalizacja kompilatora zwarcie sprawi, że po prawej stronie || nie jest oceniany, ponieważ nie zmieni wyniku wyrażenia.

+0

Nie ma nic wspólnego z optymalizacjami ani kompilatorami. Zwarcie jest standardowym zdefiniowanym zachowaniem. –

+0

Masz rację w tym sensie, że optymalizacje kompilatora są opcjonalne, a zwarcie nie jest opcjonalne. Ale intuicyjnie jest to optymalizacja. Będę edytować odpowiedź. Dzięki. –

+0

Znacznie wyraźniejsze! ... –