2013-09-23 19 views
5

Kiedy jest spacja między + +, co to jest wyrażenie "+ + a". W jaki sposób ocenia się to wyrażenie?Jakie jest znaczenie wyrażenia "+ + a"?

int main() 
    { 
     int a = 3; 

     printf("%d %d", + +a, a); 
    } 

oraz jak oceniono a+++a? Czy zdefiniowano niezdefiniowaną lub nieokreśloną definicję lub implementację?

Odpowiedz

4

Jeśli w środku jest operator o rozmiarze ++, wystarczy zastosować operator jednoargumentowy plus dwa razy.

do ekspresji a+++a, specyfikacja C mówi, że gdy istnieje taka niejednoznaczność Munch jak to możliwe (na „zachłanny lexer ” lub „ilość munch” zasada). Więc a+++a jest oceniany jako a++ + a

Zgodnie z tą zasadą, wyrazem podobnego z = y+++++x; będzie analizowany jako z = y++ ++ +x;, który jest nieważny (wynik post-przyrost nie jest sama incrementable).

+4

Znany również, nieco bardziej eufonicznie, jako zasada "Maximal Munch". –

+0

Należy zauważyć, że gdy istnieje spacja między dwoma symbolami '+', nie jest to operator inkrementacji; to dwa oddzielne operatory '+'. Z definicji nie można mieć spacji w operatorze '++'. –

8

Jest to tryb "bez wyjścia" - dwukrotnie, ponieważ + a to operacja "no-op" i jest powtarzana.

a+++a jest jednoznacznie analizowany jako a++ + a, ale prowadzi do niezdefiniowanego zachowania po uruchomieniu.

Należy pamiętać, że jeśli kod ustawiony jest na a = -3;, wydrukowana wartość będzie nadal wynosić -3, dwa razy.

+1

Po prostu dziurkacz, '+' nie zawsze jest nop, może również wymusić konwersję na szerszy typ. –

+0

@JensGustedt: Czy istnieje kontekst, w którym obecność jednoargumentowego '+' wymusiłaby zmianę, w której zmiana nie nastąpiłaby przy braku jednoznacznego '+ '? Off-hand, nie mogę myśleć o jednym. W przykładzie 'printf()', jeśli 'a' byłby' char' lub 'short', konwersja do' int' mogłaby wystąpić bez względu na to, czy '+' tam było (z powodu reguł traktowania argumentów varargs) . Jeśli istniało takie przydziały, jak "a = + a;", może to być nominalnie konwersja z powiedzenia 'char' na' int' na RHS, ale przydział zmniejszyłby to z powrotem, i to samo dotyczy '. a = a; '. –

1

+a jest przeciwieństwem -a.
W innych słowach, gdzie -a miałby przeciwny znak a, +a, po prostu ponownie potwierdził istniejący znak pozytywny/negatywny a.

Potem jest zewnętrzna pozytywny ponownie, nadal powodując 3.

Przeciwieństwem wersja będzie:

printf("%d %d",- -a,a); 

Który będzie „negatywne ujemnych 3” ... co jest znowu +3.

+1

Podane: 'a = -3;', 'b = + a;' nie jest takie samo jak 'b = abs (a);'. W pierwszym przypadku 'b' to' -3'; w drugim przypadku ('abs()') jest to '+ 3'. –

+0

Hmm nigdy o tym nie myślałem, ale nie sądzę, że + a jest przeciwieństwem -a ponieważ, + a zawsze będzie dodatnie niezależnie od wartości a, ale -a może być dodatnie lub ujemne, tzn. Dwa negacje dają wynik pozytywny, ale dwa pozytywy są również pozytywne ... po prostu mówią. –

+5

Czy + a będzie zawsze dodatni? Nie sądzę. Matematyczne, + (- 3) to _still_ -3 ... – ppeterka