2014-02-07 2 views
0

다음 코드를 감안할 때 : 작업이 수행되는 순서대로연산자 +에 대한 우선 순위와 ++

int a=0,b=1; 
int r=a+++b; 

를?

a++ + b 
    a + ++b 

이 컴파일러는 구체적입니까, 아니면 표준에 따라 달라 집니까?

+2

가능하면이 같은 진술을 피하십시오. –

+2

항상 이와 같은 병리학 적 사례는 피할 수 있습니다. 인간에게 무엇이 의미가 명확하지 않은 경우, 의미를 명확하게하기 위해 다른 구조를 사용해야합니다 (괄호와 공백과 같이). 컴파일러가 이것을 해석 할 수 있다고해서 인간이 시도하고 해보기를 원한다는 의미는 아닙니다. –

+0

@starsplusplus 죄송합니다. 당신 말이 맞아요. –

답변

4

때문에 그것은 운영자 우선 (a++) + b하지만 하지이다.

컴파일러가 의 가장 긴 토큰을 갖기 때문에 (a++) + b으로 구문 분석됩니다. 문자의 시퀀스에서이 될 수 있습니다. 즉, 렉서는 이미 읽은 것과 동일한 토큰의 일부가 될 수없는 무언가를 만날 때까지 문자를 계속 읽습니다.

는 대신 >=, 그리고 '더블'하지 ' do uble'로 double>= 하나 토큰을 해석하는 방법도있다. 이

귀하의 경우에, 그러나

a || b && c 
// "a || (b && c)" NOT "(a || b) && c", because && takes precedence 

처럼 문에 대한 연산자 연산자 우선 순위의 규칙입니다 ++와 + 이미 결정되었습니다. 운영자가 결정되면 운영자 우선 순위의 규칙이 적용될 수 있습니다.

더 자세히 설명해야 할 Why doesn't a+++++b work in C?에 대한 좋은 답변이 있습니다.

+0

두 번째 문장을 다시 표현할 것입니다. '+++ b로 구문 분석되기 때문에 ... '. 원본에는'('또는')가 없으므로이 시점에서 추가하지 않으려합니다. 표현식 평가 방법을 설명 할 때 (첫 번째 문장)를 사용할 수 있습니다. 참고 : 컴파일러는 항상 가장 긴 토큰을 사용하지는 않습니다 (템플릿을 사용하여'>>'을 둘러싼 전체 문제점을 기억하십시오). –

+0

나는 정말로 "이것이이 때문에"라는 의미 였기 때문에 "this"의 구문을 이전 문장과 동일하게 유지했다. 나는 X 다. X 다. Y는 ...이다. *는 X보다 더 혼란 스럽기 때문이다. X 다. 왜냐하면 X 다. 왜냐하면 ... 왜 템플릿이'' 가장 긴 토큰을 가지고 있기 때문입니다 : 렉서는 두 개의'>'이어야 할 때'>>'을 얻습니다. – starsplusplus

1

이것은 operator precedence에 의해 규율됩니다. 접미사가 ++ + 연산자보다 우선 순위가 높으므로 너무 결과가 b에 첨가 한 다음 증분 A는 포스트 단단한 결합 :

(a++) + b 
+5

** 사실이 아닙니다 **. 실행 * 주문 *은 운영자 우선 순위에 의해 결정됩니다. 그러나 그 시점에서 이미 사업자를 확보하고 있습니다. http://stackoverflow.com/questions/7485088/what-does-the-operation-c-ab-mean –

+2

@ user3283017이 답변은 잘못된 것으로 지적되었습니다. 수락 된 것으로 표시를 취소하고 정답을 수락하십시오. – DrYap

관련 문제