다음 코드를 감안할 때 : 작업이 수행되는 순서대로연산자 +에 대한 우선 순위와 ++
int a=0,b=1;
int r=a+++b;
를?
a++ + b
a + ++b
이 컴파일러는 구체적입니까, 아니면 표준에 따라 달라 집니까?
다음 코드를 감안할 때 : 작업이 수행되는 순서대로연산자 +에 대한 우선 순위와 ++
int a=0,b=1;
int r=a+++b;
를?
a++ + b
a + ++b
이 컴파일러는 구체적입니까, 아니면 표준에 따라 달라 집니까?
때문에 그것은 운영자 우선 (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?에 대한 좋은 답변이 있습니다.
두 번째 문장을 다시 표현할 것입니다. '+++ b로 구문 분석되기 때문에 ... '. 원본에는'('또는')가 없으므로이 시점에서 추가하지 않으려합니다. 표현식 평가 방법을 설명 할 때 (첫 번째 문장)를 사용할 수 있습니다. 참고 : 컴파일러는 항상 가장 긴 토큰을 사용하지는 않습니다 (템플릿을 사용하여'>>'을 둘러싼 전체 문제점을 기억하십시오). –
나는 정말로 "이것이이 때문에"라는 의미 였기 때문에 "this"의 구문을 이전 문장과 동일하게 유지했다. 나는 X 다. X 다. Y는 ...이다. *는 X보다 더 혼란 스럽기 때문이다. X 다. 왜냐하면 X 다. 왜냐하면 ... 왜 템플릿이'' 가장 긴 토큰을 가지고 있기 때문입니다 : 렉서는 두 개의'>'이어야 할 때'>>'을 얻습니다. – starsplusplus
이것은 operator precedence에 의해 규율됩니다. 접미사가 ++ + 연산자보다 우선 순위가 높으므로 너무 결과가 b에 첨가 한 다음 증분 A는 포스트 단단한 결합 :
는(a++) + b
** 사실이 아닙니다 **. 실행 * 주문 *은 운영자 우선 순위에 의해 결정됩니다. 그러나 그 시점에서 이미 사업자를 확보하고 있습니다. http://stackoverflow.com/questions/7485088/what-does-the-operation-c-ab-mean –
@ user3283017이 답변은 잘못된 것으로 지적되었습니다. 수락 된 것으로 표시를 취소하고 정답을 수락하십시오. – DrYap
가능하면이 같은 진술을 피하십시오. –
항상 이와 같은 병리학 적 사례는 피할 수 있습니다. 인간에게 무엇이 의미가 명확하지 않은 경우, 의미를 명확하게하기 위해 다른 구조를 사용해야합니다 (괄호와 공백과 같이). 컴파일러가 이것을 해석 할 수 있다고해서 인간이 시도하고 해보기를 원한다는 의미는 아닙니다. –
@starsplusplus 죄송합니다. 당신 말이 맞아요. –