해결된 질문
작성
·
369
2
안녕하세요! 다음 코드를 제 스스로 분석해봤는데, 정확한 분석이 맞는지 헷갈려서 질문드립니다.
(1)
Comma 연산자는 Assignment 연산자보다 서열이 낮은 것으로 알고 있습니다.
1번 예시에서 콤마가 작동하는 시기는 z에 x의 값이 대입되고, y에 값 2가 대입된 뒤인가요?
콤마 연산자는 왼쪽에서 오른쪽으로 계산을 하는데, 이미 대입연산자에 의해 각각 값이 대입된 변수 z와 y를 또 계산한다는 것이 잘 이해되지 않습니다.
이 경우의 콤마 연산자의 계산이란 무엇인지 알려주시면 감사하겠습니다.
(2)
1번 예시와 2번 예시의 차이점은 무엇이 먼저 계산되느냐 일까요?
즉 1번 예시에서는 x에 1이 대입되고, 그 값이 다시 x에 대입된 뒤, y에 2가 대입되고, 콤마 연산자가 작동한다면,
2번 예시에서는 x에 1이 대입되고, y에 2가 대입된 뒤, x의 값이 z에 대입되고, 콤마 연산자가 작동하는 건가요?
늘 친절한 답변 감사합니다.
답변 1
2
안녕하세요, 답변 도우미 Soobak 입니다.
우선, ,
콤마 연산자와 =
대입 연산자에 대해서 설명드린 후, 코드에 대해서 답변드리도록 하겠습니다.
,
콤마 연산자
: 콤마 연산자는 왼쪽에서 오른쪽으로 표현식을 계산합니다. 그리고 콤마 연산자는 표현식의 결과를 반환하는데, 이 결과는 가장 오른쪽에 있는 표현식의 결과입니다.
=
대입 연산자
: 대입 연산자의 경우, 오른쪽에서 왼쪽으로 표현식이 계산되며, 결과는 왼쪽의 변수에 대입됩니다.
연산자의 우선순위는 ,
연산자가 =
연산자보다 낮습니다.
질문(1)
: z = x = 1, y = 2;
는 콤마 연산자를 사용하여 두 개의 대입문을 결합합니다.
이 경우, 첫 번째 대입문 x = 1
이 먼저 계산되고 그 결과값 1
이 z
에 대입됩니다.,
연산자 오른쪽의 두 번째 대입문 y = 2
가 계산되어 y
에 2
가 저장됩니다.
질문(2)
: 연산자의 우선순위를 좀 더 명확하게 한다는 점에 의미가 있습니다.
1번 코드라인에서는 z = x = 1
이 계산되고, ,
연산자 이후의 y = 2
가 계산됩니다.
2번 코드라인에서서도 동일한 순서와 결과를 얻지만, 연산자의 우선순위를 좀 더 명확히 표현합니다.
콤마 연산자는 우선순위가 가장 낮은 연산자 중 하나이기 때문에, 복잡한 표현식에서 콤마 연산자를 사용할 때는 괄호를 적절히 사용하여 연산의 순서를 명확히 해주는 것이 좋습니다.
예를 들어, z = (x = 1, x + 2);
코드 라인의 경우 x = 1
과 x + 2
두 표현식은 콤마 연산자에 의해 연결되며, x = 1
이 먼저 계산되고, 그 다음 x + 2
가 계산됩니다.
그리고, 콤마 연산자의 결과값 x + 2
즉, 3
이 z
에 대입됩니다.
예시 코드와 출력 결과를 첨부드립니다.
#include <stdio.h>
int main()
{
int x = 0, y = 0, z = 0;
z = x = 1, y = 2;
printf("%-25s x = %d, y = %d, z = %d \n", "z = x = 1, y = 2", x, y, z);
z = (x = 1), (y = 2);
printf("%-25s x = %d, y = %d, z = %d \n", "z = (x = 1), (y = 2)", x, y, z);
z = ((x = 1), (y = 2));
printf("%-25s x = %d, y = %d, z = %d \n", "z = ((x = 1), (y = 2))", x, y, z);
z = (x = 1, x + 2);
printf("%-25s x = %d, y = %d, z = %d \n", "z = (x = 1, x + 2)", x, y, z);
return 0;
}
출력 결과