다음은 쉼표 연산자에 유의하세요 .
#include <iostream>
int main() {
int x;
x = 2, 3;
std::cout << x << "\n";
return 0;
}
출력 2 .
그러나 return쉼표 연산자와 함께 사용 하는 경우 다음 과 같습니다.
#include <iostream>
int f() { return 2, 3; }
int main() {
int x;
x = f();
std::cout << x << "\n";
return 0;
}
출력 3 .
쉼표 연산자가 다르게 작동하는 이유는 무엇 return입니까?
답변
받는 따르면 운영자 우선 순위 , 콤마 연산자는 보다 낮은 우선 가지고 operator=있으므로 x = 2,3;등가이다 (x = 2),3;. (연산자 우선 순위는 우선 순위에 따라 연산자가 다른 연산자보다 더 단단하거나 느슨한 방식으로 인수에 바인딩되는 방식을 결정합니다.)
쉼표식이 (x = 2),3아니라 여기에 2,3있습니다. x = 2처음에 평가되고 (그리고 그 부작용이 완료 됨) 결과가 폐기 된 다음 3평가됩니다 (실제로 아무 작업도 수행하지 않음). 그래서의 값 x이 2. 주 3전체 쉼표 표현 (즉,의 결과는 x = 2,3)에 할당하는 데 사용되지 않습니다 x. (변경 그것은하는 x = (2,3);, x할당됩니다 3.)
를 들어 return 2,3;, 쉼표 표현은 2,3, 2다음 평가의 결과는 폐기하고 3평가에 의해 반환되는 전체 쉼표 표현의 결과로 반환 return 문 이상.
표현식은 계산을 지정하는 일련의 연산자와 해당 피연산자입니다.
x = 2,3;is expression statement , x = 2,3은 여기에있는 표현식입니다.
세미콜론이 뒤에 오는 표현식은 명령문입니다.
통사론:
attr(optional) expression(optional) ; (1)
return 2,3;는 점프 문 ( return 문 )이며 2,3여기에있는 표현식입니다.
통사론:
attr(optional) return expression(optional) ; (1)
답변
쉼표 ( 표현식 분리 라고도 함 ) 연산자는 왼쪽에서 오른쪽으로 평가됩니다. 그래서 return 2,3;동일합니다 return 3;.
의 평가 x = 2,3;이다 (x = 2), 3;때문에 연산자 우선 순위 . 평가는 여전히 왼쪽에서 오른쪽으로 이루어지며 전체 표현식은 값 2를 x가정하는 부작용과 함께 값 3을 갖습니다 .
답변
이 진술 :
x = 2,3;
두 가지 표현 으로 구성됩니다 .
> x = 2
> 3
이후 운영자 우선 순위 ,
=콤마보다 우선 순위를 가지고 ,, 그래서 x = 2계산되고 이후 3 . 다음 x과 같아야합니다 2.
에서 return대신 :
int f(){ return 2,3; }
언어 구문은 다음과 같습니다.
return <expression>
메모 return 는 표현의 일부가 아닙니다.
따라서이 경우 두 표현식은 다음과 같이 평가됩니다.
> 2
> 3
그러나 두 번째 ( 3) 만 반환됩니다.
답변
괄호로 우선 순위를 강조하는 단순한 접근 방식을 적용하십시오.
( x = 2 ), 3;
return ( 2, 3 );
이제 우리는 왼쪽에서 오른쪽으로 같은 방식으로 작동하는 이항 연산자 “”를 볼 수 있습니다.