2011-12-02 5 views
0

'?' 오른쪽에서 왼쪽으로 2 회 연속 '?' 통신 수는 그런 것과 같이 대우되어야한다, 권리? C의 연관성 및 순서 포인트

int x=-1; 
int y=x?x++?x:-1:1; 

내가 기대 이제

이 실행되는 등 '?'

의이 오른쪽에서 왼쪽으로 실행되고 이후 지금
int y = x ? (x++?x:-1) : 1; 

, 첫 번째가 발생한 경우 성명에서, X의 값은 0이고 표현은

int y= x? 0 : 1; 

이 때문에 내가 y는 1 것으로 예상하지만, 내가 잘못 내 DEV-cpp.Where에 제로를 보여줍니다?

답변

2

평가 순서가 잘못되었습니다. a ? b : c에서 항상 a이 먼저 평가되고 b 또는 c이 계산됩니다.

  c 
int y=x?x++?x:-1:1; 
     a bbbbbbbb 

(A)을 평가, -1을 산출하므로 (B)가 평가 : 나는 표현식을 식별 할 수 있도록

나는 당신의 예를 표시했습니다. 거기에서 x++이 평가되어 다시 -1을 산출하므로 (c)가 평가됩니다. 당신이 말한 것처럼이 시점에서, x 더 자세한 명확 코드로, 0

또는, 그건 :

int x = -1; 
int y; 
if (x != 0) 
{ 
    int new_x = x + 1; 
    if (x != 0) 
    { 
     y = new_x; 
    } 
    else 
    { 
     y = -1; 
    } 
} 
else 
{ 
    y = 1; 
} 
+0

정상적인 조건부 물건처럼 ... 그것의 연관성은 어디에 있습니까? 사용되는 이유는 무엇입니까? a = b = c = 5에서와 같이 왼쪽에서 오른쪽으로해야하는 이유는 무엇입니까 ?? – nikel

+1

질문을 이해할 수 없습니다. 연관성은 연산자의 여러 인스턴스를 그룹화하는 방법을 지정합니다. 그러나 여기서는 상관이 없습니다. b? c : d : e'는'a? (b? c : d) : e' (유효한 표현을 형성하는 절대 다른 방법은 없습니다). 이 명세서는'a?b : c','a'가 먼저 평가 된 후'b' 또는'c'가 평가됩니다. 따라서, 그 행동은 제가 답에서 묘사하는 것과 같습니다. –

+0

나중에 ... 보통 이런 식으로 읽습니다 = a = b = c = 5. =의 조합 ​​성은 오른쪽에서 왼쪽으로 c = 5가 실행됩니다 EARLIER ... 이것은 조합 성이 exec의 순서를 정의한다는 개념으로 이어진 것입니다 ... 괜찮아요, 연관성은 엔티티를 형성하는 그룹화를 정의합니다 .... 감사합니다 :) = b = c = 5; – nikel

1

작업이 도움이

Assign y to value = 
    if(x): --> x = -1, so true as it is non-zero 
    { 
     if(x): --> x = -1 ,so true as x will increment later due to post increment 
     x= x +1; --> increment x, so x = 0 . This is the value assigned. So y = 0; 
    else: 
     -1 
    } 
    else: 
    { 
     1 
    } 

희망!

+0

; a = (b = (c = 5)) 오른쪽으로 왼쪽에서 오른쪽으로 실행됩니다 ... 왜 내 질문의 컨텍스트가 오른쪽에서 왼쪽으로 실행되지 않습니까? 왜 'x'의 초기 값을 사용합니까? – nikel

0

귀하의 질문에 대한 답변은 C/C++ int y = x ? (x++?x:-1) : 1;에서 두 개의 시퀀스 포인트 인 ?에 도달한다는 것입니다. 시퀀스 포인트가있는 변수에 대한 모든 업데이트 작업은 해당 시퀀스가 ​​끝난 후에 적용됩니다. 손에 든 우리의 예를 봅시다.

첫 번째 시퀀스 포인트는 왼쪽부터 ?입니다.

x=-1; (Actual Value) 
x=-1; (Value used in expression) 
y=-1?(x++?x:-1):1; 

두 번째 시퀀스 포인트는 왼쪽에서 두 번째 ?입니다. 위에서 언급했듯이 업데이트 작업은 시퀀스 이후에 적용되므로 x++이 있더라도이 시퀀스에 사용 된 값은 -1이며 업데이트 된 값은 다음에서 사용됩니다.

x=0; (Actual Value, bcoz of x++) 
x=-1; (Value used in expression) 
y=-1?x:-1; 

지금은이 메이크업 감각 지금

x=0; (Actual Value) 
x=0; (Value used in expression) 
y=x; 
y=0; 

희망이 될 것입니다.

+0

고려 하시겠습니까? 시퀀스 포인트로? – nikel

+0

예'? '는 시퀀스 포인트로 간주됩니다. – havexz