2015-03-27 41 views
8

Właśnie natknąłem poniższej pary zasad gramatyki C++:Czy przypisanie lub warunkowe powiązanie jest silniejsze?

conditional-expression: 
    logical-or-expression 
    logical-or-expression ? expression : assignment-expression 
             ^^^^^^^^^^^^^^^^^^^^^ 
assignment-expression: 
    conditional-expression 
    ^^^^^^^^^^^^^^^^^^^^^^ 
    unary-expression assignment-operator assignment-expression 
    throw assignment-expression_opt 

Zauważ, że reguły są wzajemnie rekurencyjne: warunkowego ekspresji dotyczy przypisania ekspresji (zasada 2) i assignment- wyrażenie odnosi się do warunkowego wyrażenia (zasada 1).

Co to oznacza w odniesieniu do pierwszeństwa operatora? Zwykle nieterminowy dla silniejszego operatora występuje po prawej stronie zasad dla słabszego operatora, ale nie na odwrót, prawda? Oto, co mnie zastanawia, konkretnie:

Z jednej strony a = b ? c : d oznacza a = (b ? c : d), co sugeruje, że ?: wiąże się silniej.

Z drugiej strony a ? b : c = d oznacza a ? b : (c = d), co sugeruje, że = wiąże się silniej.

Czy pojęcie operatora pierwszeństwo w tradycyjnym sensie po prostu nie stosuje się tutaj? Czemu?

+2

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B "Tabela pierwszeństwa, choć w większości wystarczająca, nie może rozwiązać kilku szczegółów .W szczególności należy zauważyć, że operator potrójny pozwala dowolnemu dowolnemu wyrażeniu jako jego środkowi operand, pomimo tego, że jest wymieniony jako mający wyższy priorytet niż operatory przypisania i przecinania, a zatem a, b, c: d jest interpretowany jako? (b, c): d, a nie jako pozbawiony znaczenia (a? b), (c : d). Zauważ również, że natychmiastowy, nieprywatyzowany wynik wyrażenia C cast nie może być operandem sizeof. " Ale to odnosi się do innego przypadku skrajnego. –

+0

Wikipedia również zauważa, że ​​w 'C' jest opisana jako' logiczne-OR-expression? wyrażenie: wyrażenie warunkowe', inne niż C++ –

+0

@MooingDuck Och, ta przecinek jest interesująca! – fredoverflow

Odpowiedz

6

?: i = mają takie same pierwszeństwo operatora i wiążą od prawej do lewej.

Zobacz cppreference.

+0

Interesujące. Sądzę, że zostałem odrzucony przez fakt, że inne zasoby [takie jak ten] (https://msdn.microsoft.com/en-us/library/126fe14k.aspx) twierdzą, że '?:' Wiąże się ciaśniej niż '=' . – fredoverflow