재미 함수의 반환 값이 7이 아닌 8인 이유는 무엇입니까?
C 함수의 쉼표 분리 반환 인수를 참조하면,
x=x+2,x+1;
로 평가될 것입니다.
x=x+2;
단, 다음 코드의 경우
#include<stdlib.h>
#include<stdio.h>
int fun(int x)
{
return (x=x+2,x+1); //[A]
}
int main()
{
int x=5;
x=fun(x);
printf("%d",x); // Output is 8
}
[A] 선은 다음과 같이 평가되어야 하지 않습니다.
x=x+2;
부여x = 7
성명서return (x = x + 2, x + 1);
는 다음과 같습니다.
x = x + 2; // x == 7
return x + 1; // returns 8
글을 쓸때return (x=x+2,x+1)
, 첫번째 표현이 먼저 평가되기 때문에x=x+2
가 평가되어 x가 7과 같아지는 부작용이 발생합니다.그런 다음 두 번째 식을 평가하여 반환하므로 함수가 x+1을 반환하므로 8을 반환합니다.
만약 당신이 글을 썼다면return (x+2,x+1);
, 결과는 6 이었을 것이다 왜냐하면 첫번째 표현이x+2
부작용은 없습니다
두 부분 모두return
각각 평가되고 마지막 지침의 결과가 반환됩니다.
처음에는 다음이 있습니다.
x = x + 2 // 7
지금이다x
에 업데이트됩니다.7
두 번째 평가 전에 다음 사항을 제공합니다.
x + 1 // 7 + 1 = 8
그리고 마침내 돌아옵니다.8
.
더 나은 이해를 위해 다음과 같이 중간 변수의 경우를 생각해 보십시오.
return (y = x + 2, y + 1);
편리하게 연결된 QA(Q
쉼표 연산자는 일련의 식을 평가합니다.쉼표 그룹의 값은 목록의 마지막 요소의 값입니다.
그래서 의 가치는
x+2,x+1;
가x+1
부작용도 없고요
샘플 코드:
#include<stdio.h>
int main(int argc, char * argv){
int x;
x = 0;
x = (x+2, x+1);
printf("%d\n", x);
return 0;
}
결과를 보다1
달리다 보면
하지만 당신이 할때는
return (x=x+2, x+1)
부작용이 있습니다.x
먼저 2개씩 증가하고, 그 다음엔x
는 1씩 증가하고 결과는 반환됩니다.
그것은 운영자 우선순위의 문제입니다.
x=x+2,x+1
다음과 같이 평가됩니다.(x=x+2), (x+1)
로는 아니지만x=(x+2,x+1)
다른 사용자들이 언급한 바와 같이 명령 흐름은 왼쪽에서 오른쪽으로 이동하며, 경우에는return
, 가장 오른쪽에 있는 연산자의 가치를 되돌려 줄 것입니다.연산자 앞에 쓰고 쉼표로 구분하는 것은 줄로 쓴 표현과 다를 바 없습니다.예:
return (x = x + 2, x = x - 5, x + 1);
아래 코드는 동일한 결과를 가져옵니다.
x = x + 2;
x = x - 5;
return x + 1;
위해서x = 0
, 이것은 돌아올 것입니다.-2
. 두 코드 모두, 우리가 변경할 경우x = x - 5
로.x - 5
, 즉, 우리는 뺄셈을 하고 있습니다.5
부터x
그 결과를 어디에도 저장하지 않습니다. 반환 값은x
로 변경됩니다.3
따라서 동등성을 확인할 수 있습니다.
쉼표 연산자가 코드에 시퀀스 포인트를 도입합니다.문은 다음 순서로 평가됩니다.
x = x + 2
,x
인에fun
7 입니다.x + 1
은 8 로됩니다.
명확하게 설명하자면, 연산자 우선 순위를 보여주는 괄호가 쳐진 버전은 다음과 같습니다.
return (x=x+2),x+1;
왼쪽 표현은 평가되고 그 가치는 버려집니다.오른쪽 식의 값은 반환되는 값입니다.
언급URL : https://stackoverflow.com/questions/57939065/why-is-the-return-value-of-the-fun-function-8-instead-of-7
'programing' 카테고리의 다른 글
인스턴스가 하나만 있는 경우 인스턴스 또는 클래스 특성을 사용해야 합니까? (0) | 2023.10.14 |
---|---|
vue javascript 내 정적 자산 참조 방법 (0) | 2023.10.14 |
NULL일 때 MAX 기능으로 0을 설정하는 방법은? (0) | 2023.10.14 |
인덱스를 값으로 사용하여 목록을 사전으로 변환하는 방법은 무엇입니까? (0) | 2023.10.14 |
ASP에 접속할 수 있습니까?인트라넷의 NET 개발 서버? (0) | 2023.10.14 |