2013-09-01 13 views
5

W instrukcji printf i+++j jest zawsze traktowane jako i++ +j?Czy i +++ j jest zawsze traktowane jako i ++ + j?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() { 
    int i =5,j= 6, z; 
    z=i^j; 
    printf("%d",i+++j); 
    return 0; 
} 
+2

Tak, przyrost Postfiks mają wyższy priorytet. –

+0

Tyle duplikatów, ale są one trudne do znalezienia, ponieważ +++ nie działa jako wyszukiwany termin. –

+5

@ShashankKadne: Nie ma nic wspólnego z priorytetem operatora. –

Odpowiedz

18

i+++j jest odpowiednikiem i++ + j.

Nie ma to nic wspólnego z priorytetem operatora. Przed kompresją wyrażenia +++ jest rozstrzygane przez kompilator na ++ +.

Standard C definiuje sekwencję faz tłumaczeniowych, z których każda wykorzystuje jako dane wejściowe wyjście poprzedniego. +++ został rozstrzygnięty na ++ + w fazie 3, który rozkłada źródło na tokeny preprocesora. Priorytet operatorów nie jest brany pod uwagę przed fazą 7, analizą składniową i semantyczną. (Fazy tłumaczenia nie muszą być realizowane jako odrębne fazy lub przechodzi, ale kompilator musi zachowywać się tak, jakby były.)

reguł, które mówi +++ zostanie rozwiązany do ++ + i nie + ++ jest co nieformalnie nazywany " maksymalna reguła muncha ". To stwierdzono w sekcji 6.4 pkt 4:

Jeśli strumień wejściowy został przeanalizowany pod wyprzedzającym żetony aż do danego znaku, następny przerób Token jest najdłuższa sekwencja znaków, które mogłyby stanowić wyraz przebiegu wyprzedzającego.

(Amusingly wskaźnik odnosi się do „maksymalną Munch”, lecz ten termin nie jest wymienione w innym miejscu w normie).

Oznacza to również, że i+++++j, które może być tokenized jak prawidłowe wyrażenie i++ + ++j, jest faktycznie i ++ ++ + j, co jest błędem składni.

Oczywiście rozwiązaniem dla programisty jest dodanie białych znaków, aby podział na tokeny był jasny: i++ + j. (i+++j jest całkowicie jasne dla kompilatora, ale i++ + j jest znacznie jaśniejsze ludzkiego czytelnika.)

referencyjny: N1570, sekcja 6.4, pkt 4. N1570 jest projekt normy ISO C 2011. Ta zasada nie została zmieniona z wcześniejszych wersji standardu. Fazy ​​tłumaczenia są omawiane

+0

+1 dla maksymalnej reguły muncha (nigdy wcześniej niż poprzednio). – haccks

1

Tak. Zostanie przeanalizowany jako (i++) + (j).

+3

"Tak" jest mylące. –

+0

@R ..; Dlaczego jest to dla ciebie mylące? – haccks

+4

@R ..: Oryginalny tytuł brzmiał "Czy to wyjście zależy od kompilatora?"; pierwsze zdanie w treści pytania brzmi "... czy zawsze jest traktowane jako" i ++ + j? ". Odpowiedzi to odpowiednio "nie" i "tak". Właśnie zredagowałem tytuł, przy okazji dodając "tak" poprawną odpowiedź do obu. –

-2

Ponieważ przyrostowy przyrost/dekrement operator ma wyższy priorytet niż operator dodawania, nie ma wątpliwości, że byłby traktowany jako (i ++) + j. Nie jest to więc problem kompilatora, należy raczej wziąć pod uwagę tabelę priorytetów operatorów.

Sugeruję również, aby umieścić odpowiednie spacje między wyrażeniami, byłoby to korzystne, gdyby później przejść przez swój kod. :)

Mam nadzieję, że pomaga!

+0

Jeśli to nie jest kompilator, to kto jest odpowiedzialny za parsowanie wyrażeń? – haccks

+1

"kompilator nie będzie od tego zależał" - będzie. 'i ++ + j' i' i + ++ j' są analizowane w różny sposób. –

+0

@haccks yes compiler jest odpowiedzialny i zależałoby od przestrzeni, mojej odpowiedzi w kontekście pytania. I zredagowałem to dla jasności celu. – Ashima