Programing

C ++에서 쉼표 연산자의 다른 동작이 반환됩니까?

crosscheck 2020. 10. 7. 07:22
반응형

C ++에서 쉼표 연산자의 다른 동작이 반환됩니까?


다음은 쉼표 연산자에 유의하세요 .

#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평가됩니다 (실제로 아무 작업도하지 않음). 그래서의 값 x2. 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) 반환됩니다.


Try to apply the simplistic approach just highlighting the precedence with parenthesis:

( x = 2 ), 3;

return ( 2, 3 );

Now we can see the binary operator "," working in the same way on both, from left to right.

참고URL : https://stackoverflow.com/questions/39364263/different-behaviour-of-comma-operator-in-c-with-return

반응형