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
Tak, przyrost Postfiks mają wyższy priorytet. –
Tyle duplikatów, ale są one trudne do znalezienia, ponieważ +++ nie działa jako wyszukiwany termin. –
@ShashankKadne: Nie ma nic wspólnego z priorytetem operatora. –